void init(MatrixType const & mat, row_scaling_tag const & tag) { diag_M.resize(mat.size1()); //resize without preserving values for (typename MatrixType::const_iterator1 row_it = mat.begin1(); row_it != mat.end1(); ++row_it) { for (typename MatrixType::const_iterator2 col_it = row_it.begin(); col_it != row_it.end(); ++col_it) { if (tag.norm() == 0) diag_M[col_it.index1()] = std::max<ScalarType>(diag_M[col_it.index1()], std::fabs(*col_it)); else if (tag.norm() == 1) diag_M[col_it.index1()] += std::fabs(*col_it); else if (tag.norm() == 2) diag_M[col_it.index1()] += (*col_it) * (*col_it); } if (!diag_M[row_it.index1()]) throw zero_on_diagonal_exception("ViennaCL: Zero row encountered while setting up row scaling preconditioner!"); if (tag.norm() == 2) diag_M[row_it.index1()] = std::sqrt(diag_M[row_it.index1()]); } }