Classes | Functions

Op_princomp

//! More...

Classes

class  op_princomp

Functions

template<typename eT >
static void op_princomp::direct_princomp (Mat< eT > &coeff_out, Mat< eT > &score_out, Col< eT > &latent_out, Col< eT > &tsquared_out, const Mat< eT > &in)
 //! principal component analysis -- 4 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors //! tsquared_out -> Hotelling's T^2 statistic
template<typename eT >
static void op_princomp::direct_princomp (Mat< eT > &coeff_out, Mat< eT > &score_out, Col< eT > &latent_out, const Mat< eT > &in)
 //! principal component analysis -- 3 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors
template<typename eT >
static void op_princomp::direct_princomp (Mat< eT > &coeff_out, Mat< eT > &score_out, const Mat< eT > &in)
 //! principal component analysis -- 2 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples
template<typename eT >
static void op_princomp::direct_princomp (Mat< eT > &coeff_out, const Mat< eT > &in)
 //! principal component analysis -- 1 argument version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients
template<typename T >
static 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)
 //! principal component analysis -- 4 arguments complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors //! tsquared_out -> Hotelling's T^2 statistic
template<typename T >
static void op_princomp::direct_princomp (Mat< std::complex< T > > &coeff_out, Mat< std::complex< T > > &score_out, Col< T > &latent_out, const Mat< std::complex< T > > &in)
 //! principal component analysis -- 3 arguments complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors
template<typename T >
static void op_princomp::direct_princomp (Mat< std::complex< T > > &coeff_out, Mat< std::complex< T > > &score_out, const Mat< std::complex< T > > &in)
 //! principal component analysis -- 2 arguments complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples
template<typename T >
static void op_princomp::direct_princomp (Mat< std::complex< T > > &coeff_out, const Mat< std::complex< T > > &in)
 //! principal component analysis -- 1 argument complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients
template<typename T1 >
static void op_princomp::apply (Mat< typename T1::elem_type > &out, const Op< T1, op_princomp > &in)

Detailed Description

//!


Function Documentation

template<typename eT >
void op_princomp::direct_princomp ( Mat< eT > &  coeff_out,
Mat< eT > &  score_out,
Col< eT > &  latent_out,
Col< eT > &  tsquared_out,
const Mat< eT > &  in 
) [inline, static, inherited]

//! principal component analysis -- 4 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors //! tsquared_out -> Hotelling's T^2 statistic

Definition at line 34 of file op_princomp_meat.hpp.

References arma_print(), Mat< eT >::cols(), Mat< eT >::copy_size(), diagmat(), mean(), Mat< eT >::n_cols, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), Col< eT >::rows(), Col< eT >::set_size(), sqrt(), sum(), svd(), Mat< eT >::zeros(), and Col< eT >::zeros().

  {
  arma_extra_debug_sigprint();

  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<eT> 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();  // TODO: do we need this ?  U will get automatically deleted anyway
    
    // 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<eT> s_tmp = zeros< Col<eT> >(n_cols);
      Col<eT> s_tmp(n_cols);
      s_tmp.zeros();
      
      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) = eT(1) / s_tmp.rows(0,n_rows-2);
      
      const Mat<eT> S = score_out * diagmat(Col<eT>(s_tmp));   
      tsquared_out = sum(S%S,1); 
      }
    else
      {
      // compute the Hotelling's T-squared   
      const Mat<eT> S = score_out * diagmat(Col<eT>( eT(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();
      }
    }
  
  }

template<typename eT >
void op_princomp::direct_princomp ( Mat< eT > &  coeff_out,
Mat< eT > &  score_out,
Col< eT > &  latent_out,
const Mat< eT > &  in 
) [inline, static, inherited]

//! principal component analysis -- 3 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors

Definition at line 144 of file op_princomp_meat.hpp.

References arma_print(), Mat< eT >::cols(), Mat< eT >::copy_size(), mean(), Mat< eT >::n_cols, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), Col< eT >::rows(), Col< eT >::set_size(), sqrt(), svd(), Col< eT >::zeros(), and Mat< eT >::zeros().

  {
  arma_extra_debug_sigprint();
  
  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<eT> 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();
      
      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<eT> s_tmp = zeros< Col<eT> >(n_cols);
      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);
      s = s_tmp;
      }
      
    // 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(); 
      }
    else
      {
      coeff_out.reset();
      score_out.reset();
      latent_out.reset();
      }
    }
  
  }

template<typename eT >
void op_princomp::direct_princomp ( Mat< eT > &  coeff_out,
Mat< eT > &  score_out,
const Mat< eT > &  in 
) [inline, static, inherited]

//! principal component analysis -- 2 arguments version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples

Definition at line 233 of file op_princomp_meat.hpp.

References arma_print(), Mat< eT >::cols(), Mat< eT >::copy_size(), mean(), Mat< eT >::n_cols, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), Col< eT >::rows(), sqrt(), svd(), and Mat< eT >::zeros().

  {
  arma_extra_debug_sigprint();

  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<eT> 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();
      
      Col<eT> s_tmp = zeros< Col<eT> >(n_cols);
      s_tmp.rows(0,n_rows-2) = s.rows(0,n_rows-2);
      s = s_tmp;
      }
    }
  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();
      }
    }
  }

template<typename eT >
void op_princomp::direct_princomp ( Mat< eT > &  coeff_out,
const Mat< eT > &  in 
) [inline, static, inherited]

//! principal component analysis -- 1 argument version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients

Definition at line 308 of file op_princomp_meat.hpp.

References arma_print(), mean(), Mat< eT >::n_elem, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), and svd().

Referenced by apply(), and princomp().

  {
  arma_extra_debug_sigprint();
  
  if(in.n_elem != 0)
    {
    // singular value decomposition
    Mat<eT> U;
    Col<eT> 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();
    }
  }

template<typename T >
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 
) [inline, static, inherited]

//! principal component analysis -- 4 arguments complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors //! tsquared_out -> Hotelling's T^2 statistic

Definition at line 351 of file op_princomp_meat.hpp.

References arma_print(), Mat< eT >::cols(), Mat< eT >::copy_size(), diagmat(), mean(), Mat< eT >::n_cols, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), Col< eT >::rows(), Col< eT >::set_size(), sqrt(), sum(), svd(), Col< eT >::zeros(), and Mat< eT >::zeros().

  {
  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();
      }
    }
  }

template<typename T >
void op_princomp::direct_princomp ( Mat< std::complex< T > > &  coeff_out,
Mat< std::complex< T > > &  score_out,
Col< T > &  latent_out,
const Mat< std::complex< T > > &  in 
) [inline, static, inherited]

//! principal component analysis -- 3 arguments complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples //! latent_out -> eigenvalues of principal vectors

Definition at line 459 of file op_princomp_meat.hpp.

References arma_print(), Mat< eT >::cols(), Mat< eT >::copy_size(), mean(), Mat< eT >::n_cols, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), Col< eT >::rows(), Col< eT >::set_size(), sqrt(), svd(), Col< eT >::zeros(), and Mat< eT >::zeros().

  {
  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();
      
      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 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();
      }
    else
      {
      coeff_out.reset();
      score_out.reset();
      latent_out.reset();
      }
    }
  }

template<typename T >
void op_princomp::direct_princomp ( Mat< std::complex< T > > &  coeff_out,
Mat< std::complex< T > > &  score_out,
const Mat< std::complex< T > > &  in 
) [inline, static, inherited]

//! principal component analysis -- 2 arguments complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients //! score_out -> projected samples

Definition at line 547 of file op_princomp_meat.hpp.

References arma_print(), Mat< eT >::cols(), Mat< eT >::copy_size(), mean(), Mat< eT >::n_cols, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), sqrt(), svd(), and Mat< eT >::zeros().

  {
  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();
      }
    }
  }

template<typename T >
void op_princomp::direct_princomp ( Mat< std::complex< T > > &  coeff_out,
const Mat< std::complex< T > > &  in 
) [inline, static, inherited]

//! principal component analysis -- 1 argument complex version //! computation is done via singular value decomposition //! coeff_out -> principal component coefficients

Definition at line 622 of file op_princomp_meat.hpp.

References arma_print(), mean(), Mat< eT >::n_elem, Mat< eT >::n_rows, repmat(), Mat< eT >::reset(), and svd().

  {
  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();
    }
  }

template<typename T1 >
void op_princomp::apply ( Mat< typename T1::elem_type > &  out,
const Op< T1, op_princomp > &  in 
) [inline, static, inherited]

Definition at line 660 of file op_princomp_meat.hpp.

References direct_princomp(), unwrap_check< T1 >::M, and Op< T1, op_type >::m.

  {
  arma_extra_debug_sigprint();
  
  typedef typename T1::elem_type eT;
  
  const unwrap_check<T1> tmp(in.m, out);
  const Mat<eT>& A     = tmp.M;
  
  op_princomp::direct_princomp(out, A);
  }