svd分解

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

Eigen 库:

    #include
    #include
    #include  
      
    //using Eigen::MatrixXf;  
    using namespace Eigen;  
    using namespace Eigen::internal;  
    using namespace Eigen::Architecture;  
     
    int main()
    {
    //-------------------------------svd测试    eigen
        Matrix3f A;
        A(0,0)=1,A(0,1)=0,A(0,2)=1;
        A(1,0)=0,A(1,1)=1,A(1,2)=1;
        A(2,0)=0,A(2,1)=0,A(2,2)=0;
        JacobiSVD svd(A, ComputeThinU | ComputeThinV );
        Matrix3f V = svd.matrixV(), U = svd.matrixU();
        Matrix3f  S = U.inverse() * A * V.transpose().inverse(); // S = U^-1 * A * VT * -1
        std::cout<<"A :\n"<         std::cout<<"U :\n"<         std::cout<<"S :\n"<         std::cout<<"V :\n"<         std::cout<<"U * S * VT :\n"<          system("pause");
        //-------------------------------svd测试    eigen
     
        return 0;
    }

 


OpenCV库:


    #include
    #include
    #include"opencv2/imgproc/imgproc.hpp"
    #include
     
    using namespace std;
    using namespace cv;
     
    void print(CvMat& m){
        for (int row = 0; row < m.rows; row++){
            float* ptr = (float*)(m.data.ptr + row * m.step);//第row行数据的起始指针
            for (int col = 0; col < m.cols; col++)
                cout<<*(ptr+3*col)<<"     ";
            std::cout<         }
    }
    int main ()
    {
        float abt[3 * 3] = {
            1,0,1,
            0,1,1,
            0,0,0
        };
        float abt_d[3 * 3]={0}, abt_u[3 * 3]={0}, abt_v[3 * 3]={0};
        
        CvMat ABt   = cvMat(3, 3, CV_64F, abt);//CvMat 取对数组的引用而不是拷贝
        CvMat ABt_D = cvMat(3, 3, CV_64F, abt_d);
        CvMat ABt_U = cvMat(3, 3, CV_64F, abt_u);
        CvMat ABt_VT = cvMat(3, 3, CV_64F, abt_v);
     
        cvSVD(&ABt, &ABt_D, &ABt_U, &ABt_VT, CV_SVD_V_T);//最后一个参数用于控制返回 UT或U  VT或V
        std::cout<<"A : "<         print(ABt);
        std::cout<<"U : "<         print(ABt_U);
        std::cout<<"S : "<         print(ABt_D);
        std::cout<<"V : "<         print(ABt_VT);
        system("pause");
        return 0;
    }

 

 

 
 

你可能感兴趣的:(svd分解)