Make better decision on PartialPivLU vs inverse(): We have specialized inverse() only for FIXED matrices.

This commit is contained in:
Chen-Pang He 2012-10-02 19:53:38 +08:00
parent e92fe88159
commit 21c2b4e327
2 changed files with 4 additions and 2 deletions

View File

@ -194,7 +194,7 @@ void MatrixPowerTriangular<MatrixType>::computeIntPower(const Derived& b, Result
else if (p>0) {
m_tmp1 = m_T;
}
else if (m_A.cols() > 2 && b.cols()*(pp-applyings) <= m_A.cols()*squarings) {
else if (m_OKforLU && b.cols()*(pp-applyings) <= m_A.cols()*squarings) {
res = m_T.solve(b);
for (--pp; pp >= 1; --pp)
res = m_T.solve(res);
@ -424,7 +424,7 @@ void MatrixPower<MatrixType>::computeIntPower(const Derived& b, ResultType& res,
else if (p>0) {
m_tmp1 = m_A;
}
else if (m_A.cols() > 2 && b.cols()*(pp-applyings) <= m_A.cols()*squarings) {
else if (m_OKforLU && b.cols()*(pp-applyings) <= m_A.cols()*squarings) {
PartialPivLU<MatrixType> A(m_A);
res = A.solve(b);
for (--pp; pp >= 1; --pp)

View File

@ -24,6 +24,7 @@ namespace Eigen {
typedef typename Base::RealArray RealArray;
#define EIGEN_MATRIX_POWER_PROTECTED_MEMBERS(Derived) \
using Base::m_OKforLU; \
using Base::m_A; \
using Base::m_Id; \
using Base::m_tmp1; \
@ -98,6 +99,7 @@ class MatrixPowerBase
protected:
typedef Array<RealScalar,RowsAtCompileTime,1,ColMajor,MaxRowsAtCompileTime> RealArray;
static const bool m_OKforLU = RowsAtCompileTime == Dynamic || RowsAtCompileTime > 4;
const MatrixType& m_A;
const MatrixType m_Id;