//! More...
Classes | |
struct | arma_cx_median_packet< T > |
class | op_median |
Class for finding median values of a matrix. More... | |
Functions | |
template<typename T > | |
bool | operator< (const arma_cx_median_packet< T > &A, const arma_cx_median_packet< T > &B) |
template<typename eT > | |
static eT | op_median::direct_median (std::vector< eT > &X) |
find the median value of a std::vector (contents is modified) | |
template<typename eT > | |
static eT | op_median::direct_median (const eT *X, const u32 n_elem) |
template<typename eT > | |
static eT | op_median::direct_median (const subview< eT > &X) |
template<typename eT > | |
static eT | op_median::direct_median (const diagview< eT > &X) |
template<typename T1 > | |
static void | op_median::apply (Mat< typename T1::elem_type > &out, const Op< T1, op_median > &in) |
//! For each row or for each column, find the median value. //! The result is stored in a dense matrix that has either one column or one row. //! The dimension, for which the medians are found, is set via the median() function. | |
template<typename T > | |
static void | op_median::direct_cx_median_index (u32 &out_index1, u32 &out_index2, std::vector< arma_cx_median_packet< T > > &X) |
template<typename T > | |
static void | op_median::direct_cx_median_index (u32 &out_index1, u32 &out_index2, const std::complex< T > *X, const u32 n_elem) |
template<typename T > | |
static void | op_median::direct_cx_median_index (u32 &out_index1, u32 &out_index2, const subview< std::complex< T > > &X) |
template<typename T > | |
static void | op_median::direct_cx_median_index (u32 &out_index1, u32 &out_index2, const diagview< std::complex< T > > &X) |
template<typename T , typename T1 > | |
static void | op_median::apply (Mat< std::complex< T > > &out, const Op< T1, op_median > &in) |
Implementation for complex numbers. |
//!
bool operator< | ( | const arma_cx_median_packet< T > & | A, | |
const arma_cx_median_packet< T > & | B | |||
) | [inline] |
Definition at line 33 of file op_median_proto.hpp.
eT op_median::direct_median | ( | std::vector< eT > & | X | ) | [inline, static, inherited] |
find the median value of a std::vector (contents is modified)
Definition at line 26 of file op_median_meat.hpp.
References sort().
Referenced by apply(), direct_median(), and median().
eT op_median::direct_median | ( | const eT * | X, | |
const u32 | n_elem | |||
) | [inline, static, inherited] |
Definition at line 50 of file op_median_meat.hpp.
References direct_median().
{ arma_extra_debug_sigprint(); std::vector<eT> tmp(X, X+n_elem); return op_median::direct_median(tmp); }
eT op_median::direct_median | ( | const subview< eT > & | X | ) | [inline, static, inherited] |
Definition at line 63 of file op_median_meat.hpp.
References direct_median(), and subview< eT >::n_elem.
{ arma_extra_debug_sigprint(); std::vector<eT> tmp(X.n_elem); for(u32 i=0; i<X.n_elem; ++i) { tmp[i] = X[i]; } return op_median::direct_median(tmp); }
eT op_median::direct_median | ( | const diagview< eT > & | X | ) | [inline, static, inherited] |
Definition at line 82 of file op_median_meat.hpp.
References direct_median(), and diagview< eT >::n_elem.
{ arma_extra_debug_sigprint(); std::vector<eT> tmp(X.n_elem); for(u32 i=0; i<X.n_elem; ++i) { tmp[i] = X[i]; } return op_median::direct_median(tmp); }
void op_median::apply | ( | Mat< typename T1::elem_type > & | out, | |
const Op< T1, op_median > & | in | |||
) | [inline, static, inherited] |
//! For each row or for each column, find the median value. //! The result is stored in a dense matrix that has either one column or one row. //! The dimension, for which the medians are found, is set via the median() function.
Definition at line 105 of file op_median_meat.hpp.
References Mat< eT >::at(), Op< T1, op_type >::aux_u32_a, Mat< eT >::colptr(), direct_median(), unwrap_check< T1 >::M, Op< T1, op_type >::m, Mat< eT >::n_cols, Mat< eT >::n_elem, Mat< eT >::n_rows, and Mat< eT >::set_size().
{ arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; const unwrap_check<T1> tmp(in.m, out); const Mat<eT>& X = tmp.M; arma_debug_check( (X.n_elem == 0), "median(): given matrix has no elements" ); const u32 dim = in.aux_u32_a; arma_debug_check( (dim > 1), "median(): incorrect usage. dim must be 0 or 1"); if(dim == 0) // column-wise { arma_extra_debug_print("op_median::apply(), dim = 0"); out.set_size(1, X.n_cols); std::vector<eT> tmp_vec(X.n_rows); for(u32 col=0; col<X.n_cols; ++col) { const eT* colmem = X.colptr(col); for(u32 row=0; row<X.n_rows; ++row) { tmp_vec[row] = colmem[row]; } out[col] = op_median::direct_median(tmp_vec); } } else if(dim == 1) // row-wise { arma_extra_debug_print("op_median::apply(), dim = 1"); out.set_size(X.n_rows, 1); std::vector<eT> tmp_vec(X.n_cols); for(u32 row=0; row<X.n_rows; ++row) { for(u32 col=0; col<X.n_cols; ++col) { tmp_vec[col] = X.at(row,col); } out[row] = op_median::direct_median(tmp_vec); } } }
void op_median::direct_cx_median_index | ( | u32 & | out_index1, | |
u32 & | out_index2, | |||
std::vector< arma_cx_median_packet< T > > & | X | |||
) | [inline, static, inherited] |
Definition at line 167 of file op_median_meat.hpp.
References sort().
Referenced by apply(), direct_cx_median_index(), and median().
void op_median::direct_cx_median_index | ( | u32 & | out_index1, | |
u32 & | out_index2, | |||
const std::complex< T > * | X, | |||
const u32 | n_elem | |||
) | [inline, static, inherited] |
Definition at line 194 of file op_median_meat.hpp.
References abs(), and direct_cx_median_index().
{ arma_extra_debug_sigprint(); std::vector< arma_cx_median_packet<T> > tmp(n_elem); for(u32 i=0; i<n_elem; ++i) { tmp[i].val = std::abs(X[i]); tmp[i].index = i; } op_median::direct_cx_median_index(out_index1, out_index2, tmp); }
void op_median::direct_cx_median_index | ( | u32 & | out_index1, | |
u32 & | out_index2, | |||
const subview< std::complex< T > > & | X | |||
) | [inline, static, inherited] |
Definition at line 214 of file op_median_meat.hpp.
References abs(), and direct_cx_median_index().
{ arma_extra_debug_sigprint(); const u32 n_elem = X.n_elem; std::vector< arma_cx_median_packet<T> > tmp(n_elem); for(u32 i=0; i<n_elem; ++i) { tmp[i].val = std::abs(X[i]); tmp[i].index = i; } op_median::direct_cx_median_index(out_index1, out_index2, tmp); }
void op_median::direct_cx_median_index | ( | u32 & | out_index1, | |
u32 & | out_index2, | |||
const diagview< std::complex< T > > & | X | |||
) | [inline, static, inherited] |
Definition at line 236 of file op_median_meat.hpp.
References abs(), and direct_cx_median_index().
{ arma_extra_debug_sigprint(); const u32 n_elem = X.n_elem; std::vector< arma_cx_median_packet<T> > tmp(n_elem); for(u32 i=0; i<n_elem; ++i) { tmp[i].val = std::abs(X[i]); tmp[i].index = i; } op_median::direct_cx_median_index(out_index1, out_index2, tmp); }
void op_median::apply | ( | Mat< std::complex< T > > & | out, | |
const Op< T1, op_median > & | in | |||
) | [inline, static, inherited] |
Implementation for complex numbers.
Definition at line 259 of file op_median_meat.hpp.
References abs(), Mat< eT >::at(), Op< T1, op_type >::aux_u32_a, Mat< eT >::colptr(), direct_cx_median_index(), unwrap_check< T1 >::M, Op< T1, op_type >::m, Mat< eT >::n_cols, Mat< eT >::n_elem, and Mat< eT >::n_rows.
{ arma_extra_debug_sigprint(); typedef typename std::complex<T> eT; isnt_same_type<eT, typename T1::elem_type>::check(); const unwrap_check<T1> tmp(in.m, out); const Mat<eT>& X = tmp.M; arma_debug_check( (X.n_elem == 0), "median(): given matrix has no elements" ); const u32 dim = in.aux_u32_a; arma_debug_check( (dim > 1), "median(): incorrect usage. dim must be 0 or 1"); if(dim == 0) // column-wise { arma_extra_debug_print("op_median::apply(), dim = 0"); out.set_size(1, X.n_cols); std::vector< arma_cx_median_packet<T> > tmp_vec(X.n_rows); for(u32 col=0; col<X.n_cols; ++col) { const eT* colmem = X.colptr(col); for(u32 row=0; row<X.n_rows; ++row) { tmp_vec[row].val = std::abs(colmem[row]); tmp_vec[row].index = row; } u32 index1; u32 index2; op_median::direct_cx_median_index(index1, index2, tmp_vec); out[col] = (colmem[index1] + colmem[index2]) / T(2); } } else if(dim == 1) // row-wise { arma_extra_debug_print("op_median::apply(), dim = 1"); out.set_size(X.n_rows, 1); std::vector< arma_cx_median_packet<T> > tmp_vec(X.n_cols); for(u32 row=0; row<X.n_rows; ++row) { for(u32 col=0; col<X.n_cols; ++col) { tmp_vec[col].val = std::abs(X.at(row,col)); tmp_vec[row].index = col; } u32 index1; u32 index2; op_median::direct_cx_median_index(index1, index2, tmp_vec); out[row] = ( X.at(row,index1) + X.at(row,index2) ) / T(2); } } }