13 #ifndef eli_mutil_opt_least_squares_hpp
14 #define eli_mutil_opt_least_squares_hpp
16 #include "eli/code_eli.hpp"
24 template<
typename data1__,
typename data2__,
typename data3__>
25 void least_squares_uncon(Eigen::MatrixBase<data1__> &x,
const Eigen::MatrixBase<data2__> &A,
const Eigen::MatrixBase<data3__> &r)
27 unsigned int flags(0);
28 if (Eigen::MatrixBase<data2__>::ColsAtCompileTime==Eigen::Dynamic)
29 flags=Eigen::ComputeThinU | Eigen::ComputeThinV;
31 flags=Eigen::ComputeFullU | Eigen::ComputeFullV;
33 Eigen::JacobiSVD<typename Eigen::MatrixBase<data2__>::PlainObject > svd(A, flags);
37 template<
typename data1__,
typename data2__,
typename data3__,
typename data4__,
typename data5__>
38 void least_squares_eqcon(Eigen::MatrixBase<data1__> &x,
const Eigen::MatrixBase<data2__> &A,
const Eigen::MatrixBase<data3__> &b,
const Eigen::MatrixBase<data4__> &B,
const Eigen::MatrixBase<data5__> &d)
40 typedef Eigen::Matrix<typename Eigen::MatrixBase<data4__>::Scalar, Eigen::Dynamic, Eigen::Dynamic> B_matrixD;
41 B_matrixD Q, R, temp_B, temp_R;
42 typedef Eigen::Matrix<typename Eigen::MatrixBase<data2__>::Scalar, Eigen::Dynamic, Eigen::Dynamic> A_matrixD;
43 A_matrixD A1, A2, temp_A;
44 typedef Eigen::Matrix<typename Eigen::MatrixBase<data5__>::Scalar, Eigen::Dynamic, Eigen::Dynamic> d_matrixD;
46 typedef Eigen::Matrix<typename Eigen::MatrixBase<data3__>::Scalar, Eigen::Dynamic, Eigen::Dynamic> b_matrixD;
48 typedef Eigen::Matrix<typename Eigen::MatrixBase<data1__>::Scalar, Eigen::Dynamic, Eigen::Dynamic> x_matrixD;
49 x_matrixD x_temp(A.cols(), b.cols());
50 typename A_matrixD::Index p(B.rows()), n(A.cols());
52 typename A_matrixD::Index m(b.rows());
56 Eigen::HouseholderQR<B_matrixD> qr(B.transpose());
59 temp_R=Eigen::TriangularView<B_matrixD, Eigen::Upper>(temp_B);
61 assert((R.rows()==p) && (R.cols()==p));
62 assert((Q.rows()==n) && (Q.cols()==n));
66 A1=temp_A.leftCols(p);
67 A2=temp_A.rightCols(n-p);
69 assert((A1.rows()==m) && (A1.cols()==p));
70 assert((A2.rows()==m) && (A2.cols()==n-p));
73 assert(A2.cols()==n-p);
76 y=R.transpose().lu().solve(d);
84 x_temp.bottomRows(n-p)=z;
void least_squares_eqcon(Eigen::MatrixBase< data1__ > &x, const Eigen::MatrixBase< data2__ > &A, const Eigen::MatrixBase< data3__ > &b, const Eigen::MatrixBase< data4__ > &B, const Eigen::MatrixBase< data5__ > &d)
Definition: least_squares.hpp:38
void least_squares_uncon(Eigen::MatrixBase< data1__ > &x, const Eigen::MatrixBase< data2__ > &A, const Eigen::MatrixBase< data3__ > &r)
Definition: least_squares.hpp:25