Automatic Differentiation
 
Loading...
Searching...
No Matches
qr_thin_R.hpp
Go to the documentation of this file.
1#ifndef STAN_MATH_PRIM_FUN_QR_THIN_R_HPP
2#define STAN_MATH_PRIM_FUN_QR_THIN_R_HPP
3
6#include <algorithm>
7
8namespace stan {
9namespace math {
10
18template <typename EigMat, require_eigen_t<EigMat>* = nullptr>
19Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic> qr_thin_R(
20 const EigMat& m) {
21 using matrix_t
22 = Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
23 if (unlikely(m.size() == 0)) {
24 return matrix_t(0, 0);
25 }
26 Eigen::HouseholderQR<matrix_t> qr(m.rows(), m.cols());
27 qr.compute(m);
28 const int min_size = std::min(m.rows(), m.cols());
29 matrix_t R = qr.matrixQR().topLeftCorner(min_size, m.cols());
30 R.template triangularView<Eigen::StrictlyLower>().setZero();
31 for (int i = 0; i < min_size; ++i) {
32 if (R(i, i) < 0) {
33 R.row(i) *= -1.0;
34 }
35 }
36 return R;
37}
38
39} // namespace math
40} // namespace stan
41
42#endif
#define unlikely(x)
std::tuple< Eigen::Matrix< value_type_t< EigMat >, Eigen::Dynamic, Eigen::Dynamic >, Eigen::Matrix< value_type_t< EigMat >, Eigen::Dynamic, Eigen::Dynamic > > qr(const EigMat &m)
Returns the fat QR decomposition.
Definition qr.hpp:25
matrix_cl< double > qr_thin_R(T_m &&m)
Returns the orthogonal factor of the thin QR decomposition.
Definition qr_thin_R.hpp:20
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...