10 #ifndef EIGEN_ITERSCALING_H
11 #define EIGEN_ITERSCALING_H
47 template<
typename _MatrixType>
84 VectorXd Dr, Dc, DrRes, DcRes;
85 Dr.resize(
m); Dc.resize(
n);
86 DrRes.resize(
m); DcRes.resize(
n);
87 double EpsRow = 1.0, EpsCol = 1.0;
92 Dr.setZero(); Dc.setZero();
93 for (
int k=0; k<
m_matrix.outerSize(); ++k)
95 for (
typename MatrixType::InnerIterator it(
m_matrix, k); it; ++it)
97 if ( Dr(it.row()) <
abs(it.value()) )
98 Dr(it.row()) =
abs(it.value());
100 if ( Dc(it.col()) <
abs(it.value()) )
101 Dc(it.col()) =
abs(it.value());
104 for (
int i = 0;
i <
m; ++
i)
108 for (
int i = 0;
i <
n; ++
i)
113 for (
int i = 0;
i <
m; ++
i)
117 for (
int i = 0;
i <
n; ++
i)
122 DrRes.setZero(); DcRes.setZero();
123 for (
int k=0; k<
m_matrix.outerSize(); ++k)
125 for (
typename MatrixType::InnerIterator it(
m_matrix, k); it; ++it)
127 it.valueRef() = it.value()/( Dr(it.row()) * Dc(it.col()) );
129 if ( DrRes(it.row()) <
abs(it.value()) )
130 DrRes(it.row()) =
abs(it.value());
132 if ( DcRes(it.col()) <
abs(it.value()) )
133 DcRes(it.col()) =
abs(it.value());
136 DrRes.array() = (1-DrRes.array()).
abs();
137 EpsRow = DrRes.maxCoeff();
138 DcRes.array() = (1-DcRes.array()).
abs();
139 EpsCol = DcRes.maxCoeff();