10 #ifndef EIGEN_INCOMPLETE_LU_H
11 #define EIGEN_INCOMPLETE_LU_H
15 template <
typename _Scalar>
18 typedef _Scalar Scalar;
19 typedef Matrix<Scalar,Dynamic,1> Vector;
20 typedef typename Vector::Index Index;
21 typedef SparseMatrix<Scalar,RowMajor> FactorType;
24 typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;
26 IncompleteLU() : m_isInitialized(false) {}
28 template<
typename MatrixType>
29 IncompleteLU(
const MatrixType& mat) : m_isInitialized(false)
34 Index rows()
const {
return m_lu.rows(); }
35 Index cols()
const {
return m_lu.cols(); }
37 template<
typename MatrixType>
38 IncompleteLU& compute(
const MatrixType& mat)
41 int size = mat.cols();
43 for(
int i=0; i<size; ++i)
45 typename FactorType::InnerIterator k_it(m_lu,i);
46 for(; k_it && k_it.index()<i; ++k_it)
49 k_it.valueRef() /= diag(k);
51 typename FactorType::InnerIterator j_it(k_it);
52 typename FactorType::InnerIterator kj_it(m_lu, k);
53 while(kj_it && kj_it.index()<=k) ++kj_it;
56 if(kj_it.index()==j_it.index())
58 j_it.valueRef() -= k_it.value() * kj_it.value();
62 else if(kj_it.index()<j_it.index()) ++kj_it;
66 if(k_it && k_it.index()==i) diag(i) = k_it.value();
69 m_isInitialized =
true;
73 template<
typename Rhs,
typename Dest>
74 void _solve(
const Rhs& b, Dest& x)
const
76 x = m_lu.template triangularView<UnitLower>().solve(b);
77 x = m_lu.template triangularView<Upper>().solve(x);
80 template<
typename Rhs>
inline const internal::solve_retval<IncompleteLU, Rhs>
81 solve(
const MatrixBase<Rhs>& b)
const
83 eigen_assert(m_isInitialized &&
"IncompleteLU is not initialized.");
84 eigen_assert(cols()==b.rows()
85 &&
"IncompleteLU::solve(): invalid number of rows of the right hand side matrix b");
86 return internal::solve_retval<IncompleteLU, Rhs>(*
this, b.derived());
96 template<
typename _MatrixType,
typename Rhs>
97 struct solve_retval<IncompleteLU<_MatrixType>, Rhs>
98 : solve_retval_base<IncompleteLU<_MatrixType>, Rhs>
100 typedef IncompleteLU<_MatrixType> Dec;
101 EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
103 template<typename Dest>
void evalTo(Dest& dst)
const
105 dec()._solve(rhs(),dst);
113 #endif // EIGEN_INCOMPLETE_LU_H