Advertisement
bogdb

lapacke repro

Feb 19th, 2020
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #define EIGEN_USE_LAPACKE
  2.  
  3. #include <cblas.h>
  4. #include <lapacke.h>
  5.  
  6. #include <Eigen/Core>
  7. #include <Eigen/Dense>
  8.  
  9. #include <iostream>
  10. #include <memory>
  11.  
  12. template<typename T>
  13. using Matrix = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor>;
  14.  
  15. template<typename T>
  16. using Vector = Eigen::Matrix<T, Eigen::Dynamic, 1, Eigen::ColMajor>;
  17.  
  18. int main(int argc, char** argv) {
  19.     Matrix<double> a(3,3);
  20.     a << 12, -51,   4,
  21.           6, 167, -68,
  22.          -4,  24, -41;
  23.  
  24.     std::cout << "A =\n" << a << "\n";
  25.     Vector<double> b = Vector<double>::Random(5);
  26.     std::cout << "b =\n" << b << "\n";
  27.  
  28.     std::cout << "LAPACKE:\n";
  29.     Matrix<double> m = a;
  30.     Vector<int> jpvt(m.rows());
  31.     jpvt.fill(0);
  32.  
  33.     Vector<double> tau(m.rows());
  34.     tau.fill(0);
  35.    
  36.     auto status = LAPACKE_dgeqp3(CblasColMajor, m.rows(), m.cols(), m.data(), m.rows(), jpvt.data(), tau.data());  
  37.     std::cout << "status = " << status << "\n";
  38.    
  39.     decltype(m) m1 = m.triangularView<Eigen::Upper>();
  40.     std::cout << "m:\n" << m1 << "\n";
  41.     std::cout << "jpvt:\n" << jpvt << "\n";
  42.     std::cout << "tau:\n" << tau << "\n";
  43.  
  44.     std::cout << "\n\nEIGEN:\n";
  45.     Eigen::ColPivHouseholderQR<decltype(a)> qr = a.colPivHouseholderQr();
  46.     std::cout << "hcoeff:\n" << qr.hCoeffs() << "\n";
  47.  
  48.     Matrix<double> q = qr.householderQ();
  49.     Matrix<double> r = qr.matrixR().template triangularView<Eigen::Upper>();
  50.     decltype(qr)::PermutationType p = qr.colsPermutation();
  51.     std::cout << "Q:\n" << q << "\n";
  52.     std::cout << "P:\n" << p.toDenseMatrix() << "\n";
  53.     std::cout << "R:\n" << r << "\n";
  54.  
  55.     Matrix<double> aa = q * r;
  56.     std::cout << "Q * R:\n" << aa << "\n";
  57.  
  58.     Matrix<double> ap = aa * p.transpose();
  59.     std::cout << "A * P:\n" << ap << "\n";
  60.  
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement