45 uvec
sort_rcm(
const std::vector<uvec>&,
const uvec&);
47 template<
typename eT> uvec
sort_rcm(
const SpMat<eT>& MEAT) {
49 if(!MEAT.is_square())
throw logic_error(
"RCM() can only be applied to square matrix.\n");
60 uvec
E(
S, fill::none);
61 suanpan_for(0llu,
S, [&](
const uword I) { E(I) = MEAT.col(I).n_nonzero; });
63 std::vector<uvec>
A(
S);
67 for(
auto L = MEAT.begin_col(K); L != MEAT.end_col(K); ++L) IDX(J++) = L.row();
68 A[K] = IDX(sort_index(E(IDX)));
72 uvec
G = sort_index(E);
75 std::vector<bool>
M(
S,
false);
77 uvec R(
S, fill::zeros);
86 uword IDXA = 0, IDXB =
S - 1, IDXC =
S - 1;
99 while(IDXA <
S && M[G(IDXA)]) ++IDXA;
113 for(
const auto& IDX : A[R(IDXB--)])
if(!M[IDX]) M[R(IDXC--) = IDX] =
true;
117 suanpan_debug(
"RCM algorithm takes %.5E seconds.\n", TM.toc());
123 template<
typename eT> uvec
sort_rcm(
const Mat<eT>& MEAT) {
return sort_rcm(SpMat<eT>(MEAT)); }
128 const uvec row_idx(csc_mat.row_idx, csc_mat.
n_elem,
false,
false);
129 const uvec col_ptr(csc_mat.col_ptr, csc_mat.
n_cols + 1,
false,
false);
130 const Col<dt> val_idx(csc_mat.val_idx, csc_mat.
n_elem,
false,
false);
uvec sort_rcm(const std::vector< uvec > &, const uvec &)
Definition: sort_rcm.cpp:20
void suanpan_debug(const char *M,...)
Definition: print.cpp:64
void suanpan_for(const IT start, const IT end, F &&FN)
Definition: utility.h:24