私はEigenで反復ソルバー(CGなど)にカスタムプリコンディショナーを使用しようとしています。具体的には、同様の問題を複数回解決する必要があります。行列はわずかに変化しますが、平均行列の近くにとどまります。私は平均行列のコレスキー分解を計算し、これを前提条件として使用したいと思います。私が念頭に置いていた何Eigenでカスタムプリコンディショナーを使用する方法
のようなものです:
ConjugateGradient< SparseMatrix<double>, Lower, CholmodSupernodalLLT<SparseMatrix<double>> > solver(meanMatrix);
solver.preconditioner().compute(meanMatrix);
// Loop on n similar matrices
for(int i = 0; i < n; i++){
// create matrix: it is similar (in structure and in values) to meanMatrix
SparseMatrix<double> matrix = ...;
// create right-hand-side
VectorXd rhs = ...;
// update matrix reference for solver
solver.compute(matrix);
// solve using the preconditioned CG
solver.solve(rhs);
}
問題がsolver.compute(マトリックス)を呼び出すと、実際に(IterativeSolverBase実際には)ConjugateGradientを引き起こすことがある(そのプレコンディショナーに計算を呼び出すために。LをIterativeSolverBase.h、固有3.2.9の111)を参照してください。
m_preconditioner.compute(*mp_matrix);
すなわち、平均行列に基づいて、前処理は、コレスキー12月に置き換えられ新しい行列の除外、したがってCG解は1回の反復で収束する。逆に、私はと同じ前提条件(平均行列のコレスキー分解、ループの前に一度だけ計算された)を保ち、前処理済みCGを使って異なる行列を解きます。
私がやろうとしていることを達成するための簡単な方法はありますか?
ご協力いただきありがとうございます。私はこれが理にかなってほしい。そうでない場合は、私に明確にすることを躊躇しないでください。