33class DiagonalPreconditioner
35 typedef _Scalar Scalar;
37 typedef typename Vector::Index Index;
43 DiagonalPreconditioner() : m_isInitialized(
false) {}
45 template<
typename MatType>
46 DiagonalPreconditioner(
const MatType& mat) : m_invdiag(mat.cols())
51 Index rows()
const {
return m_invdiag.size(); }
52 Index cols()
const {
return m_invdiag.size(); }
54 template<
typename MatType>
55 DiagonalPreconditioner& analyzePattern(
const MatType& )
60 template<
typename MatType>
61 DiagonalPreconditioner& factorize(
const MatType& mat)
63 m_invdiag.resize(mat.cols());
64 for(
int j=0; j<mat.outerSize(); ++j)
66 typename MatType::InnerIterator it(mat,j);
67 while(it && it.index()!=j) ++it;
68 if(it && it.index()==j)
69 m_invdiag(j) = Scalar(1)/it.value();
73 m_isInitialized =
true;
77 template<
typename MatType>
78 DiagonalPreconditioner& compute(
const MatType& mat)
80 return factorize(mat);
83 template<
typename Rhs,
typename Dest>
84 void _solve(
const Rhs& b, Dest& x)
const
86 x = m_invdiag.array() * b.array() ;
89 template<
typename Rhs>
inline const internal::solve_retval<DiagonalPreconditioner, Rhs>
92 eigen_assert(m_isInitialized &&
"DiagonalPreconditioner is not initialized.");
93 eigen_assert(m_invdiag.size()==b.rows()
94 &&
"DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b");
95 return internal::solve_retval<DiagonalPreconditioner, Rhs>(*
this, b.derived());
100 bool m_isInitialized;