From f0238cfb6997c4acfc2bd200de7295f3fa36968f Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 3 Mar 2019 21:09:10 +0100 Subject: don't index Eigen --- eigen/doc/examples/matrixfree_cg.cpp | 129 ----------------------------------- 1 file changed, 129 deletions(-) delete mode 100644 eigen/doc/examples/matrixfree_cg.cpp (limited to 'eigen/doc/examples/matrixfree_cg.cpp') diff --git a/eigen/doc/examples/matrixfree_cg.cpp b/eigen/doc/examples/matrixfree_cg.cpp deleted file mode 100644 index 7469938..0000000 --- a/eigen/doc/examples/matrixfree_cg.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#include -#include -#include -#include -#include - -class MatrixReplacement; -using Eigen::SparseMatrix; - -namespace Eigen { -namespace internal { - // MatrixReplacement looks-like a SparseMatrix, so let's inherits its traits: - template<> - struct traits : public Eigen::internal::traits > - {}; -} -} - -// Example of a matrix-free wrapper from a user type to Eigen's compatible type -// For the sake of simplicity, this example simply wrap a Eigen::SparseMatrix. -class MatrixReplacement : public Eigen::EigenBase { -public: - // Required typedefs, constants, and method: - typedef double Scalar; - typedef double RealScalar; - typedef int StorageIndex; - enum { - ColsAtCompileTime = Eigen::Dynamic, - MaxColsAtCompileTime = Eigen::Dynamic, - IsRowMajor = false - }; - - Index rows() const { return mp_mat->rows(); } - Index cols() const { return mp_mat->cols(); } - - template - Eigen::Product operator*(const Eigen::MatrixBase& x) const { - return Eigen::Product(*this, x.derived()); - } - - // Custom API: - MatrixReplacement() : mp_mat(0) {} - - void attachMyMatrix(const SparseMatrix &mat) { - mp_mat = &mat; - } - const SparseMatrix my_matrix() const { return *mp_mat; } - -private: - const SparseMatrix *mp_mat; -}; - - -// Implementation of MatrixReplacement * Eigen::DenseVector though a specialization of internal::generic_product_impl: -namespace Eigen { -namespace internal { - - template - struct generic_product_impl // GEMV stands for matrix-vector - : generic_product_impl_base > - { - typedef typename Product::Scalar Scalar; - - template - static void scaleAndAddTo(Dest& dst, const MatrixReplacement& lhs, const Rhs& rhs, const Scalar& alpha) - { - // This method should implement "dst += alpha * lhs * rhs" inplace, - // however, for iterative solvers, alpha is always equal to 1, so let's not bother about it. - assert(alpha==Scalar(1) && "scaling is not implemented"); - EIGEN_ONLY_USED_FOR_DEBUG(alpha); - - // Here we could simply call dst.noalias() += lhs.my_matrix() * rhs, - // but let's do something fancier (and less efficient): - for(Index i=0; i S = Eigen::MatrixXd::Random(n,n).sparseView(0.5,1); - S = S.transpose()*S; - - MatrixReplacement A; - A.attachMyMatrix(S); - - Eigen::VectorXd b(n), x; - b.setRandom(); - - // Solve Ax = b using various iterative solver with matrix-free version: - { - Eigen::ConjugateGradient cg; - cg.compute(A); - x = cg.solve(b); - std::cout << "CG: #iterations: " << cg.iterations() << ", estimated error: " << cg.error() << std::endl; - } - - { - Eigen::BiCGSTAB bicg; - bicg.compute(A); - x = bicg.solve(b); - std::cout << "BiCGSTAB: #iterations: " << bicg.iterations() << ", estimated error: " << bicg.error() << std::endl; - } - - { - Eigen::GMRES gmres; - gmres.compute(A); - x = gmres.solve(b); - std::cout << "GMRES: #iterations: " << gmres.iterations() << ", estimated error: " << gmres.error() << std::endl; - } - - { - Eigen::DGMRES gmres; - gmres.compute(A); - x = gmres.solve(b); - std::cout << "DGMRES: #iterations: " << gmres.iterations() << ", estimated error: " << gmres.error() << std::endl; - } - - { - Eigen::MINRES minres; - minres.compute(A); - x = minres.solve(b); - std::cout << "MINRES: #iterations: " << minres.iterations() << ", estimated error: " << minres.error() << std::endl; - } -} -- cgit v1.2.3