void run_tutorial() { /** * Get Eigen matrix and vector types for the provided ScalarType. * Involves a little bit of template-metaprogramming. **/ typedef typename Eigen_dense_matrix<ScalarType>::type EigenMatrix; typedef typename Eigen_vector<ScalarType>::type EigenVector; /** * Create and fill dense matrices from the Eigen library: **/ EigenMatrix eigen_densemat(6, 5); EigenMatrix eigen_densemat2(6, 5); eigen_densemat(0,0) = 2.0; eigen_densemat(0,1) = -1.0; eigen_densemat(1,0) = -1.0; eigen_densemat(1,1) = 2.0; eigen_densemat(1,2) = -1.0; eigen_densemat(2,1) = -1.0; eigen_densemat(2,2) = -1.0; eigen_densemat(2,3) = -1.0; eigen_densemat(3,2) = -1.0; eigen_densemat(3,3) = 2.0; eigen_densemat(3,4) = -1.0; eigen_densemat(5,4) = -1.0; eigen_densemat(4,4) = -1.0; Eigen::Map<EigenMatrix> eigen_densemat_map(eigen_densemat.data(), 6, 5); // same as eigen_densemat, but emulating user-provided buffer /** * Create and fill sparse matrices from the Eigen library: **/ Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat(6, 5); Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat2(6, 5); eigen_sparsemat.reserve(5*2); eigen_sparsemat.insert(0,0) = 2.0; eigen_sparsemat.insert(0,1) = -1.0; eigen_sparsemat.insert(1,1) = 2.0; eigen_sparsemat.insert(1,2) = -1.0; eigen_sparsemat.insert(2,2) = -1.0; eigen_sparsemat.insert(2,3) = -1.0; eigen_sparsemat.insert(3,3) = 2.0; eigen_sparsemat.insert(3,4) = -1.0; eigen_sparsemat.insert(5,4) = -1.0; //eigen_sparsemat.endFill(); /** * Create and fill a few vectors from the Eigen library: **/ EigenVector eigen_rhs(5); Eigen::Map<EigenVector> eigen_rhs_map(eigen_rhs.data(), 5); EigenVector eigen_result(6); EigenVector eigen_temp(6); eigen_rhs(0) = 10.0; eigen_rhs(1) = 11.0; eigen_rhs(2) = 12.0; eigen_rhs(3) = 13.0; eigen_rhs(4) = 14.0; /** * Create the corresponding ViennaCL objects: **/ viennacl::vector<ScalarType> vcl_rhs(5); viennacl::vector<ScalarType> vcl_result(6); viennacl::matrix<ScalarType> vcl_densemat(6, 5); viennacl::compressed_matrix<ScalarType> vcl_sparsemat(6, 5); /** * Directly copy the Eigen objects to ViennaCL objects **/ viennacl::copy(&(eigen_rhs[0]), &(eigen_rhs[0]) + 5, vcl_rhs.begin()); // Method 1: via iterator interface (cf. std::copy()) viennacl::copy(eigen_rhs, vcl_rhs); // Method 2: via built-in wrappers (convenience layer) viennacl::copy(eigen_rhs_map, vcl_rhs); // Same as method 2, but for a mapped vector viennacl::copy(eigen_densemat, vcl_densemat); viennacl::copy(eigen_densemat_map, vcl_densemat); //same as above, using mapped matrix viennacl::copy(eigen_sparsemat, vcl_sparsemat); std::cout << "VCL sparsematrix dimensions: " << vcl_sparsemat.size1() << ", " << vcl_sparsemat.size2() << std::endl; // For completeness: Copy matrices from ViennaCL back to Eigen: viennacl::copy(vcl_densemat, eigen_densemat2); viennacl::copy(vcl_sparsemat, eigen_sparsemat2); /** * Run dense matrix-vector products and compare results: **/ eigen_result = eigen_densemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_densemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for dense matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for dense matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_densemat2 * eigen_rhs - eigen_temp).norm() << std::endl; /** * Run sparse matrix-vector products and compare results: **/ eigen_result = eigen_sparsemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_sparsemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for sparse matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for sparse matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_sparsemat2 * eigen_rhs - eigen_temp).norm() << std::endl; }
void run_test() { // // get Eigen matrix and vector types for the provided ScalarType: // typedef typename Eigen_dense_matrix<ScalarType>::type EigenMatrix; typedef typename Eigen_vector<ScalarType>::type EigenVector; // // Create and fill dense matrices from the Eigen library: // EigenMatrix eigen_densemat(6, 5); EigenMatrix eigen_densemat2(6, 5); eigen_densemat(0,0) = 2.0; eigen_densemat(0,1) = -1.0; eigen_densemat(1,0) = -1.0; eigen_densemat(1,1) = 2.0; eigen_densemat(1,2) = -1.0; eigen_densemat(2,1) = -1.0; eigen_densemat(2,2) = -1.0; eigen_densemat(2,3) = -1.0; eigen_densemat(3,2) = -1.0; eigen_densemat(3,3) = 2.0; eigen_densemat(3,4) = -1.0; eigen_densemat(5,4) = -1.0; eigen_densemat(4,4) = -1.0; // // Create and fill sparse matrices from the Eigen library: // Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat(6, 5); Eigen::SparseMatrix<ScalarType, Eigen::RowMajor> eigen_sparsemat2(6, 5); eigen_sparsemat.reserve(5*2); eigen_sparsemat.insert(0,0) = 2.0; eigen_sparsemat.insert(0,1) = -1.0; eigen_sparsemat.insert(1,1) = 2.0; eigen_sparsemat.insert(1,2) = -1.0; eigen_sparsemat.insert(2,2) = -1.0; eigen_sparsemat.insert(2,3) = -1.0; eigen_sparsemat.insert(3,3) = 2.0; eigen_sparsemat.insert(3,4) = -1.0; eigen_sparsemat.insert(5,4) = -1.0; //eigen_sparsemat.endFill(); // // Create and fill a few vectors from the Eigen library: // EigenVector eigen_rhs(5); EigenVector eigen_result(6); EigenVector eigen_temp(6); eigen_rhs(0) = 10.0; eigen_rhs(1) = 11.0; eigen_rhs(2) = 12.0; eigen_rhs(3) = 13.0; eigen_rhs(4) = 14.0; // // Let us create the ViennaCL analogues: // viennacl::vector<ScalarType> vcl_rhs(5); viennacl::vector<ScalarType> vcl_result(6); viennacl::matrix<ScalarType> vcl_densemat(6, 5); viennacl::compressed_matrix<ScalarType> vcl_sparsemat(6, 5); // // Directly copy the Eigen objects to ViennaCL objects // viennacl::copy(&(eigen_rhs[0]), &(eigen_rhs[0]) + 5, vcl_rhs.begin()); //method 1: via iterator interface (cf. std::copy()) viennacl::copy(eigen_rhs, vcl_rhs); //method 2: via built-in wrappers (convenience layer) viennacl::copy(eigen_densemat, vcl_densemat); viennacl::copy(eigen_sparsemat, vcl_sparsemat); std::cout << "VCL sparsematrix dimensions: " << vcl_sparsemat.size1() << ", " << vcl_sparsemat.size2() << std::endl; // For completeness: Copy matrices from ViennaCL back to Eigen: viennacl::copy(vcl_densemat, eigen_densemat2); viennacl::copy(vcl_sparsemat, eigen_sparsemat2); // // Run matrix-vector products and compare results: // eigen_result = eigen_densemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_densemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for dense matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for dense matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_densemat2 * eigen_rhs - eigen_temp).norm() << std::endl; // // Same for sparse matrix: // eigen_result = eigen_sparsemat * eigen_rhs; vcl_result = viennacl::linalg::prod(vcl_sparsemat, vcl_rhs); viennacl::copy(vcl_result, eigen_temp); std::cout << "Difference for sparse matrix-vector product: " << (eigen_result - eigen_temp).norm() << std::endl; std::cout << "Difference for sparse matrix-vector product (Eigen->ViennaCL->Eigen): " << (eigen_sparsemat2 * eigen_rhs - eigen_temp).norm() << std::endl; // // Please have a look at the other tutorials on how to use the ViennaCL types // }