aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/IterativeLinearSolvers
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2015-06-25 17:17:38 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2015-06-25 17:17:38 +0200
commit7f824dd613fe79e68efc4691972c30a5956bc0e6 (patch)
tree16ac6c7c09105c6ad27ce92f969e843390da7ba8 /Eigen/src/IterativeLinearSolvers
parentc5f9eafcbc2a5c7f513b1024d5666ebaebf016af (diff)
Optimize CG to enable faster spare row-major * dense vector products when the input matrix is complete (Upper|Lower) but column major.
Diffstat (limited to 'Eigen/src/IterativeLinearSolvers')
-rw-r--r--Eigen/src/IterativeLinearSolvers/ConjugateGradient.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h b/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
index de576edc9..5f0159e52 100644
--- a/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
+++ b/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
@@ -185,10 +185,13 @@ public:
template<typename Rhs,typename Dest>
void _solve_with_guess_impl(const Rhs& b, Dest& x) const
{
+ typedef Ref<const MatrixType> MatRef;
+ typedef typename internal::conditional<UpLo==(Lower|Upper) && (!MatrixType::IsRowMajor) && (!NumTraits<Scalar>::IsComplex),
+ Transpose<const MatRef>, MatRef const&>::type RowMajorWrapper;
typedef typename internal::conditional<UpLo==(Lower|Upper),
- Ref<const MatrixType>&,
- typename Ref<const MatrixType>::template ConstSelfAdjointViewReturnType<UpLo>::Type
- >::type MatrixWrapperType;
+ RowMajorWrapper,
+ typename MatRef::template ConstSelfAdjointViewReturnType<UpLo>::Type
+ >::type SelfAdjointWrapper;
m_iterations = Base::maxIterations();
m_error = Base::m_tolerance;
@@ -198,7 +201,8 @@ public:
m_error = Base::m_tolerance;
typename Dest::ColXpr xj(x,j);
- internal::conjugate_gradient(MatrixWrapperType(mp_matrix), b.col(j), xj, Base::m_preconditioner, m_iterations, m_error);
+ RowMajorWrapper row_mat(mp_matrix);
+ internal::conjugate_gradient(SelfAdjointWrapper(row_mat), b.col(j), xj, Base::m_preconditioner, m_iterations, m_error);
}
m_isInitialized = true;