Stan Math Library  2.11.0
reverse mode automatic differentiation
factor_cov_matrix.hpp
Go to the documentation of this file.
1 #ifndef STAN_MATH_PRIM_MAT_FUN_FACTOR_COV_MATRIX_HPP
2 #define STAN_MATH_PRIM_MAT_FUN_FACTOR_COV_MATRIX_HPP
3 
6 #include <cstddef>
7 
8 
9 namespace stan {
10 
11  namespace math {
12 
25  template<typename T>
26  bool
27  factor_cov_matrix(const Eigen::Matrix
28  <T, Eigen::Dynamic, Eigen::Dynamic>& Sigma,
29  Eigen::Array<T, Eigen::Dynamic, 1>& CPCs,
30  Eigen::Array<T, Eigen::Dynamic, 1>& sds) {
31  size_t K = sds.rows();
32 
33  sds = Sigma.diagonal().array();
34  if ( (sds <= 0.0).any() ) return false;
35  sds = sds.sqrt();
36 
37  Eigen::DiagonalMatrix<T, Eigen::Dynamic> D(K);
38  D.diagonal() = sds.inverse();
39  sds = sds.log(); // now unbounded
40 
41  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> R = D * Sigma * D;
42  // to hopefully prevent pivoting due to floating point error
43  R.diagonal().setOnes();
44  Eigen::LDLT<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> > ldlt;
45  ldlt = R.ldlt();
46  if (!ldlt.isPositive())
47  return false;
48  Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> U = ldlt.matrixU();
49  factor_U(U, CPCs);
50  return true;
51  }
52 
53  }
54 
55 }
56 
57 #endif
bool factor_cov_matrix(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &Sigma, Eigen::Array< T, Eigen::Dynamic, 1 > &CPCs, Eigen::Array< T, Eigen::Dynamic, 1 > &sds)
This function is intended to make starting values, given a covariance matrix Sigma.
void factor_U(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &U, Eigen::Array< T, Eigen::Dynamic, 1 > &CPCs)
This function is intended to make starting values, given a unit upper-triangular matrix U such that U...
Definition: factor_U.hpp:29

     [ Stan Home Page ] © 2011–2016, Stan Development Team.