mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-03-13 18:37:27 +08:00
bug #1423: fix LSCG\'s Jacobi preconditioner for row-major matrices.
This commit is contained in:
parent
4bbc320468
commit
682b2ef17e
@ -152,13 +152,28 @@ class LeastSquareDiagonalPreconditioner : public DiagonalPreconditioner<_Scalar>
|
||||
{
|
||||
// Compute the inverse squared-norm of each column of mat
|
||||
m_invdiag.resize(mat.cols());
|
||||
for(Index j=0; j<mat.outerSize(); ++j)
|
||||
if(MatType::IsRowMajor)
|
||||
{
|
||||
RealScalar sum = mat.innerVector(j).squaredNorm();
|
||||
if(sum>0)
|
||||
m_invdiag(j) = RealScalar(1)/sum;
|
||||
else
|
||||
m_invdiag(j) = RealScalar(1);
|
||||
m_invdiag.setZero();
|
||||
for(Index j=0; j<mat.outerSize(); ++j)
|
||||
{
|
||||
for(typename MatType::InnerIterator it(mat,j); it; ++it)
|
||||
m_invdiag(it.index()) += it.value();
|
||||
}
|
||||
for(Index j=0; j<mat.cols(); ++j)
|
||||
if(m_invdiag(j)>0)
|
||||
m_invdiag(j) = RealScalar(1)/m_invdiag(j);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(Index j=0; j<mat.outerSize(); ++j)
|
||||
{
|
||||
RealScalar sum = mat.innerVector(j).squaredNorm();
|
||||
if(sum>0)
|
||||
m_invdiag(j) = RealScalar(1)/sum;
|
||||
else
|
||||
m_invdiag(j) = RealScalar(1);
|
||||
}
|
||||
}
|
||||
Base::m_isInitialized = true;
|
||||
return *this;
|
||||
|
@ -14,12 +14,20 @@ template<typename T> void test_lscg_T()
|
||||
{
|
||||
LeastSquaresConjugateGradient<SparseMatrix<T> > lscg_colmajor_diag;
|
||||
LeastSquaresConjugateGradient<SparseMatrix<T>, IdentityPreconditioner> lscg_colmajor_I;
|
||||
LeastSquaresConjugateGradient<SparseMatrix<T,RowMajor> > lscg_rowmajor_diag;
|
||||
LeastSquaresConjugateGradient<SparseMatrix<T,RowMajor>, IdentityPreconditioner> lscg_rowmajor_I;
|
||||
|
||||
CALL_SUBTEST( check_sparse_square_solving(lscg_colmajor_diag) );
|
||||
CALL_SUBTEST( check_sparse_square_solving(lscg_colmajor_I) );
|
||||
|
||||
CALL_SUBTEST( check_sparse_leastsquare_solving(lscg_colmajor_diag) );
|
||||
CALL_SUBTEST( check_sparse_leastsquare_solving(lscg_colmajor_I) );
|
||||
|
||||
CALL_SUBTEST( check_sparse_square_solving(lscg_rowmajor_diag) );
|
||||
CALL_SUBTEST( check_sparse_square_solving(lscg_rowmajor_I) );
|
||||
|
||||
CALL_SUBTEST( check_sparse_leastsquare_solving(lscg_rowmajor_diag) );
|
||||
CALL_SUBTEST( check_sparse_leastsquare_solving(lscg_rowmajor_I) );
|
||||
}
|
||||
|
||||
void test_lscg()
|
||||
|
Loading…
x
Reference in New Issue
Block a user