arma_hot inline void running_stat_vec<eT>::operator() (const Base<typename get_pod_type<eT>::result, T1>& X) { arma_extra_debug_sigprint(); //typedef typename get_pod_type<eT>::result T; const unwrap<T1> tmp(X.get_ref()); const Mat<eT>& sample = tmp.M; if( sample.is_empty() ) { return; } if( sample.is_finite() == false ) { arma_print("running_stat_vec: sample ignored as it has non-finite elements"); return; } running_stat_vec_aux::update_stats(*this, sample); }
inline void op_princomp::direct_princomp ( Mat< std::complex<T> >& coeff_out, const Mat< std::complex<T> >& in ) { arma_extra_debug_sigprint(); typedef typename std::complex<T> eT; if(in.n_elem != 0) { // singular value decomposition Mat<eT> U; Col< T> s; const Mat<eT> tmp = in - repmat(mean(in), in.n_rows, 1); const bool svd_ok = svd(U,s,coeff_out, tmp); if(svd_ok == false) { arma_print("princomp(): singular value decomposition failed"); coeff_out.reset(); } } else { coeff_out.reset(); } }
inline void arma_hot arma_warn(const bool state, const arma_boost::basic_format<T1,T2>& x) { if(state==true) arma_print(x); }
inline void arma_hot arma_warn(const bool state, const T1& x, const T2& y) { if(state==true) { arma_print(x,y); } }
inline void op_princomp::direct_princomp ( Mat< std::complex<T> >& coeff_out, Mat< std::complex<T> >& score_out, const Mat< std::complex<T> >& in ) { arma_extra_debug_sigprint(); typedef std::complex<T> eT; const u32 n_rows = in.n_rows; const u32 n_cols = in.n_cols; if(n_rows > 1) // more than one sample { // subtract the mean - use score_out as temporary matrix score_out = in - repmat(mean(in), n_rows, 1); // singular value decomposition Mat<eT> U; Col< T> s; const bool svd_ok = svd(U,s,coeff_out,score_out); if(svd_ok == false) { arma_print("princomp(): singular value decomposition failed"); coeff_out.reset(); score_out.reset(); return; } // U.reset(); // normalize the eigenvalues s /= std::sqrt(n_rows - 1); // project the samples to the principals score_out *= coeff_out; if(n_rows <= n_cols) // number of samples is less than their dimensionality { score_out.cols(n_rows-1,n_cols-1).zeros(); } } else // single sample - row { if(n_rows == 1) { coeff_out = eye< Mat<eT> >(n_cols, n_cols); score_out.copy_size(in); score_out.zeros(); } else { coeff_out.reset(); score_out.reset(); } } }
inline void op_princomp::direct_princomp ( Mat< std::complex<T> >& coeff_out, Mat< std::complex<T> >& score_out, Col<T>& latent_out, Col< std::complex<T> >& tsquared_out, const Mat< std::complex<T> >& in ) { arma_extra_debug_sigprint(); typedef std::complex<T> eT; const u32 n_rows = in.n_rows; const u32 n_cols = in.n_cols; if(n_rows > 1) // more than one sample { // subtract the mean - use score_out as temporary matrix score_out = in - repmat(mean(in), n_rows, 1); // singular value decomposition Mat<eT> U; Col<T> s; const bool svd_ok = svd(U,s,coeff_out,score_out); if(svd_ok == false) { arma_print("princomp(): singular value decomposition failed"); coeff_out.reset(); score_out.reset(); latent_out.reset(); tsquared_out.reset(); return; } //U.reset(); // normalize the eigenvalues s /= std::sqrt(n_rows - 1); // project the samples to the principals score_out *= coeff_out; if(n_rows <= n_cols) // number of samples is less than their dimensionality { score_out.cols(n_rows-1,n_cols-1).zeros(); Col<T> s_tmp = zeros< Col<T> >(n_cols); s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2); s = s_tmp; // compute the Hotelling's T-squared s_tmp.rows(0,n_rows-2) = 1.0 / s_tmp.rows(0,n_rows-2); const Mat<eT> S = score_out * diagmat(Col<T>(s_tmp)); tsquared_out = sum(S%S,1); } else { // compute the Hotelling's T-squared const Mat<eT> S = score_out * diagmat(Col<T>(T(1) / s)); tsquared_out = sum(S%S,1); } // compute the eigenvalues of the principal vectors latent_out = s%s; } else // single sample - row { if(n_rows == 1) { coeff_out = eye< Mat<eT> >(n_cols, n_cols); score_out.copy_size(in); score_out.zeros(); latent_out.set_size(n_cols); latent_out.zeros(); tsquared_out.set_size(1); tsquared_out.zeros(); } else { coeff_out.reset(); score_out.reset(); latent_out.reset(); tsquared_out.reset(); } } }