1#ifndef STAN_MATH_PRIM_FUN_QR_HPP
2#define STAN_MATH_PRIM_FUN_QR_HPP
22template <
typename EigMat, require_eigen_t<EigMat>* =
nullptr>
23std::tuple<Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>,
24 Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>>
27 = Eigen::Matrix<value_type_t<EigMat>, Eigen::Dynamic, Eigen::Dynamic>;
29 return std::make_tuple(matrix_t(0, 0), matrix_t(0, 0));
32 Eigen::HouseholderQR<matrix_t>
qr(m.rows(), m.cols());
34 matrix_t Q =
qr.householderQ();
35 const int min_size = std::min(m.rows(), m.cols());
36 for (
int i = 0; i < min_size; i++) {
37 if (
qr.matrixQR().coeff(i, i) < 0) {
41 matrix_t R =
qr.matrixQR();
42 if (m.rows() > m.cols()) {
43 R.bottomRows(m.rows() - m.cols()).setZero();
45 for (
int i = 0; i < min_size; i++) {
46 for (
int j = 0; j < i; j++) {
47 R.coeffRef(i, j) = 0.0;
53 return std::make_tuple(std::move(Q), std::move(R));
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.
The lgamma implementation in stan-math is based on either the reentrant safe lgamma_r implementation ...