refactor to reuse code

This commit is contained in:
conrad
2022-05-31 14:42:41 +10:00
parent 20d33c2656
commit e21e38de64
3 changed files with 27 additions and 22 deletions
+3 -22
View File
@@ -193,18 +193,9 @@ norm
{
const SpMat<eT>& m = sv.m;
const uword col = sv.aux_col1;
const eT* mem = &(m.values[ m.col_ptrs[col] ]);
// create a fake dense vector to allow reuse of code for dense vectors
Col<eT> fake_vector( access::rwp(&(m.values[ m.col_ptrs[col] ])), sv.n_nonzero, false );
const Proxy< Col<eT> > P_fake_vector(fake_vector);
if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); }
if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); }
arma_debug_check( (k == 0), "norm(): k must be greater than zero" );
return op_norm::vec_norm_k(P_fake_vector, int(k));
return spop_norm::vec_norm_k(mem, sv.n_nonzero, k);
}
}
@@ -217,17 +208,7 @@ norm
if(is_vec)
{
// create a fake dense vector to allow reuse of code for dense vectors
Col<eT> fake_vector( access::rwp(X.values), X.n_nonzero, false );
const Proxy< Col<eT> > P_fake_vector(fake_vector);
if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); }
if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); }
arma_debug_check( (k == 0), "norm(): k must be greater than zero" );
return op_norm::vec_norm_k(P_fake_vector, int(k));
return spop_norm::vec_norm_k(X.values, X.n_nonzero, k);
}
else
{
@@ -31,6 +31,8 @@ class spop_norm
template<typename eT> inline static typename get_pod_type<eT>::result mat_norm_2(const SpMat<eT>& X, const typename arma_cx_only<eT>::result* junk = nullptr);
template<typename eT> inline static typename get_pod_type<eT>::result mat_norm_inf(const SpMat<eT>& X);
template<typename eT> inline static typename get_pod_type<eT>::result vec_norm_k(const eT* mem, const uword N, const uword k);
};
+22
View File
@@ -104,4 +104,26 @@ spop_norm::mat_norm_inf(const SpMat<eT>& X)
template<typename eT>
inline
typename get_pod_type<eT>::result
spop_norm::vec_norm_k(const eT* mem, const uword N, const uword k)
{
arma_extra_debug_sigprint();
arma_debug_check( (k == 0), "norm(): k must be greater than zero" );
// create a fake dense vector to allow reuse of code for dense vectors
Col<eT> fake_vector( access::rwp(mem), N, false );
const Proxy< Col<eT> > P_fake_vector(fake_vector);
if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); }
if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); }
return op_norm::vec_norm_k(P_fake_vector, int(k));
}
//! @}