refactor to reuse code
This commit is contained in:
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
//! @}
|
||||
|
||||
Reference in New Issue
Block a user