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()]); } }
void init(MatrixType const & mat, row_scaling_tag const & tag) { switch (tag.norm()) { case 0: detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_INF); break; case 1: detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_1); break; case 2: detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_2); break; default: throw unknown_norm_exception("Unknown norm when initializing row_scaling preconditioner!"); } }
void init(MatrixType const & mat, row_scaling_tag const & tag) { switch (tag.norm()) { case 0: detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_INF); break; case 1: detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_1); break; case 2: detail::row_info(mat, diag_M, detail::SPARSE_ROW_NORM_2); break; default: throw "Unknown norm!"; } }