2016-12-08 12 views
2

この公式Webページで説明されているものと同様のEigenライブラリに基づいてラッパーが必要なC++ソフトウェアを作成していますMatrixFree - Eigenライブラリを使用したMatrixFree-Matrix(Vector)製品

https://eigen.tuxfamily.org/dox/group__MatrixfreeSolverExample.html

上記のWebページのコードを使用して、テンプレートベースのクラスをMatrixReplacementにラップすることができます。

例からMatrixReplacementの実装を維持するには、次の(メイン)コードが

int main() 
{ 
    int n = 10; 
    Eigen::SparseMatrix<double> S = Eigen::MatrixXd::Random(n,n).sparseView(0.5,1); 
    S = S.transpose()*S; 
    MatrixReplacement A; 
    A.attachMyMatrix(S); 
    Eigen::VectorXd b(n,1), x1(n,1), x2(n,1); 
    b.setRandom(); 

    x1.noalias() = A * b; 
    x2.noalias() = S * b; 
    std::cout<<(x1-x2).colwise().norm()<<std::endl; 
} 

を動作しますが、代わりにベクターを使用して、私はBの行列を使用したいと コードはコンパイルされませんxは、場合行方不明のメンバーと型

int main() 
{ 
    int n = 10; 
    Eigen::SparseMatrix<double> S = Eigen::MatrixXd::Random(n,n).sparseView(0.5,1); 
    S = S.transpose()*S; 
    MatrixReplacement A; 
    A.attachMyMatrix(S); 
    Eigen::MatrixXd b(n,3), x1(n,3), x2(n,3); 
    b.setRandom(); 

    x1.noalias() = A * b; //<<<<<<<<<<< COMPILE ERROR 
    x2.noalias() = S * b; 
    std::cout<<(x1-x2).colwise().norm()<<std::endl; 
} 

のために文句を私の質問は:私の第二主と連携するために、ウェブページhttps://eigen.tuxfamily.org/dox/group__MatrixfreeSolverExample.htmlでの例から欠落しているもの?

ありがとうございます!


EDIT:ループ

for(Index i=0; i<lhs.cols(); ++i) 
    dst += rhs(i) * lhs.my_matrix().col(i); 

ためのWebページの例では

for(Index i=0; i<lhs.cols(); ++i) 
    for(Index j=0; j<rhs.cols(); ++j) 
     dst.col(j) += rhs(i,j) * lhs.my_matrix().col(i); 

または単に

dst.noalias() += lhs.my_matrix() * rhs 
のようなものに変更する必要があります

答えて

0

スペシャリストinternal::generic_product_implの場合、GemvProductGemmProductに変更する必要があります。

関連する問題