38 typedef _Scalar Scalar;
39 typedef Matrix<Scalar,Dynamic,1>
Vector;
41 typedef typename Vector::StorageIndex StorageIndex;
49 template<
typename MatType>
55 Index rows()
const {
return m_invdiag.size(); }
56 Index cols()
const {
return m_invdiag.size(); }
58 template<
typename MatType>
64 template<
typename MatType>
67 m_invdiag.
resize(mat.cols());
68 for(
int j=0; j<mat.outerSize(); ++j)
70 typename MatType::InnerIterator it(mat,j);
71 while(it && it.index()!=j) ++it;
72 if(it && it.index()==j && it.value()!=Scalar(0))
73 m_invdiag(j) = Scalar(1)/it.value();
75 m_invdiag(j) = Scalar(1);
77 m_isInitialized =
true;
81 template<
typename MatType>
84 return factorize(mat);
88 template<
typename Rhs,
typename Dest>
89 void _solve_impl(
const Rhs& b, Dest& x)
const
91 x = m_invdiag.array() * b.array() ;
94 template<
typename Rhs>
inline const Solve<DiagonalPreconditioner, Rhs>
95 solve(
const MatrixBase<Rhs>& b)
const
97 eigen_assert(m_isInitialized &&
"DiagonalPreconditioner is not initialized.");
98 eigen_assert(m_invdiag.size()==b.rows()
99 &&
"DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b");
100 return Solve<DiagonalPreconditioner, Rhs>(*
this, b.derived());
107 bool m_isInitialized;