当前位置:   article > 正文

SVD分解 Eigen库 opencv库_eigen svd

eigen svd

如题,使用库函数进行svd分解,形如 A = U * S * VT.

Eigen 库:

  1. #include <iostream>
  2. #include <Eigen/SVD>
  3. #include <Eigen/Dense>
  4. //using Eigen::MatrixXf;
  5. using namespace Eigen;
  6. using namespace Eigen::internal;
  7. using namespace Eigen::Architecture;
  8. int main()
  9. {
  10. //-------------------------------svd测试 eigen
  11. Matrix3f A;
  12. A(0,0)=1,A(0,1)=0,A(0,2)=1;
  13. A(1,0)=0,A(1,1)=1,A(1,2)=1;
  14. A(2,0)=0,A(2,1)=0,A(2,2)=0;
  15. JacobiSVD<Eigen::MatrixXf> svd(A, ComputeThinU | ComputeThinV );
  16. Matrix3f V = svd.matrixV(), U = svd.matrixU();
  17. Matrix3f S = U.inverse() * A * V.transpose().inverse(); // S = U^-1 * A * VT * -1
  18. std::cout<<"A :\n"<<A<<std::endl;
  19. std::cout<<"U :\n"<<U<<std::endl;
  20. std::cout<<"S :\n"<<S<<std::endl;
  21. std::cout<<"V :\n"<<V<<std::endl;
  22. std::cout<<"U * S * VT :\n"<<U * S * V.transpose()<<std::endl;
  23. system("pause");
  24. //-------------------------------svd测试 eigen
  25. return 0;
  26. }



OpenCV库:


  1. #include <opencv2/core/core.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. #include"opencv2/imgproc/imgproc.hpp"
  4. #include <iostream>
  5. using namespace std;
  6. using namespace cv;
  7. void print(CvMat& m){
  8. for (int row = 0; row < m.rows; row++){
  9. float* ptr = (float*)(m.data.ptr + row * m.step);//第row行数据的起始指针
  10. for (int col = 0; col < m.cols; col++)
  11. cout<<*(ptr+3*col)<<" ";
  12. std::cout<<std::endl;
  13. }
  14. }
  15. int main ()
  16. {
  17. float abt[3 * 3] = {
  18. 1,0,1,
  19. 0,1,1,
  20. 0,0,0
  21. };
  22. float abt_d[3 * 3]={0}, abt_u[3 * 3]={0}, abt_v[3 * 3]={0};
  23. CvMat ABt = cvMat(3, 3, CV_64F, abt);//CvMat 取对数组的引用而不是拷贝
  24. CvMat ABt_D = cvMat(3, 3, CV_64F, abt_d);
  25. CvMat ABt_U = cvMat(3, 3, CV_64F, abt_u);
  26. CvMat ABt_VT = cvMat(3, 3, CV_64F, abt_v);
  27. cvSVD(&ABt, &ABt_D, &ABt_U, &ABt_VT, CV_SVD_V_T);//最后一个参数用于控制返回 UT或U  VT或V
  28. std::cout<<"A : "<<std::endl;
  29. print(ABt);
  30. std::cout<<"U : "<<std::endl;
  31. print(ABt_U);
  32. std::cout<<"S : "<<std::endl;
  33. print(ABt_D);
  34. std::cout<<"V : "<<std::endl;
  35. print(ABt_VT);
  36. system("pause");
  37. return 0;
  38. }





声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/78171?site
推荐阅读
相关标签
  

闽ICP备14008679号