29 const Eigen::VectorXd &b,
30 const Eigen::MatrixXd &constr) {
33 bool nonzero_found =
false;
34 for (
Index j = 0; j < A.cols(); j++) {
35 nonzero_found = A.col(j).isApproxToConstant(0.0, 1
e-9);
37 throw std::runtime_error(
"constrained_qrsolve_zero_column_in_matrix");
41 const Index NoVariables = A.cols();
42 const Index NoConstrains =
44 const Index deg_of_freedom = NoVariables - NoConstrains;
46 Eigen::HouseholderQR<Eigen::MatrixXd> QR(constr.transpose());
49 auto A_new = A * QR.householderQ();
53 Eigen::MatrixXd A2 = A_new.rightCols(deg_of_freedom);
56 Eigen::HouseholderQR<Eigen::MatrixXd> QR2(A2);
57 Eigen::VectorXd z = QR2.solve(b);
60 Eigen::VectorXd result = Eigen::VectorXd::Zero(NoVariables);
61 result.tail(deg_of_freedom) = z;
63 return QR.householderQ() * result;