この公式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
のようなものに変更する必要があります