Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define EIGEN_USE_LAPACKE
- #include <cblas.h>
- #include <lapacke.h>
- #include <Eigen/Core>
- #include <Eigen/Dense>
- #include <iostream>
- #include <memory>
- template<typename T>
- using Matrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>;
- template<typename T>
- using Vector = Eigen::Matrix<T, Eigen::Dynamic, 1, Eigen::ColMajor>;
- int main(int argc, char** argv) {
- Matrix<double> a(3,3);
- a << 12, -51, 4,
- 6, 167, -68,
- -4, 24, -41;
- std::cout << "A =\n" << a << "\n";
- Vector<double> b = Vector<double>::Random(5);
- std::cout << "b =\n" << b << "\n";
- std::cout << "LAPACKE:\n";
- Matrix<double> m = a;
- Vector<int> jpvt(m.rows());
- jpvt.fill(0);
- Vector<double> tau(m.rows());
- tau.fill(0);
- auto status = LAPACKE_dgeqp3(CblasColMajor, m.rows(), m.cols(), m.data(), m.rows(), jpvt.data(), tau.data());
- std::cout << "status = " << status << "\n";
- decltype(m) m1 = m.triangularView<Eigen::Upper>();
- std::cout << "m:\n" << m1 << "\n";
- std::cout << "jpvt:\n" << jpvt << "\n";
- std::cout << "tau:\n" << tau << "\n";
- std::cout << "\n\nEIGEN:\n";
- Eigen::ColPivHouseholderQR<decltype(a)> qr = a.colPivHouseholderQr();
- std::cout << "hcoeff:\n" << qr.hCoeffs() << "\n";
- Matrix<double> q = qr.householderQ();
- Matrix<double> r = qr.matrixR().template triangularView<Eigen::Upper>();
- decltype(qr)::PermutationType p = qr.colsPermutation();
- std::cout << "Q:\n" << q << "\n";
- std::cout << "P:\n" << p.toDenseMatrix() << "\n";
- std::cout << "R:\n" << r << "\n";
- Matrix<double> aa = q * r;
- std::cout << "Q * R:\n" << aa << "\n";
- Matrix<double> ap = aa * p.transpose();
- std::cout << "A * P:\n" << ap << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement