svd分解

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

Eigen 库:

    #include <iostream>
    #include <Eigen/SVD>
    #include <Eigen/Dense>  
      
    //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<Eigen::MatrixXf> 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"<<A<<std::endl;
        std::cout<<"U :\n"<<U<<std::endl;
        std::cout<<"S :\n"<<S<<std::endl;
        std::cout<<"V :\n"<<V<<std::endl;
        std::cout<<"U * S * VT :\n"<<U * S * V.transpose()<<std::endl;
         system("pause");
        //-------------------------------svd测试    eigen
     
        return 0;
    }

 


OpenCV库:


    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include"opencv2/imgproc/imgproc.hpp"
    #include <iostream>
     
    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<<std::endl;
        }
    }
    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 : "<<std::endl;
        print(ABt);
        std::cout<<"U : "<<std::endl;
        print(ABt_U);
        std::cout<<"S : "<<std::endl;
        print(ABt_D);
        std::cout<<"V : "<<std::endl;
        print(ABt_VT);
        system("pause");
        return 0;
    }

 

 

 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SVD分解(奇异值分解)是一种重要的矩阵分解方法,可以将一个矩阵分解为多个部分。在电子设计中,Verilog是一种硬件描述语言,用于描述和设计数字电路。 SVD分解可以用于优化数字电路设计中的计算问题。通过将复杂的运算转化为简单的矩阵运算,可以加快电路的速度和效率。在Verilog中,我们可以使用SVD分解来实现这种优化。 在Verilog中,我们可以使用模块化设计的思想将SVD分解的各个部分进行描述和实现。通过创建多个模块,每个模块负责一个特定的SVD分解操作,我们可以将整个过程拆分为多个小部分,提高代码的可读性和可维护性。 首先,我们需要定义输入和输出端口。输入端口包括待分解的矩阵,输出端口包括分解后得到的结果。然后,我们可以通过调用已有的Verilog库函数或自己编写的模块来实现SVD分解的各个步骤,如特征值计算、特征向量计算等。 在Verilog中,我们可以使用多种数据结构和算法来实现SVD分解。例如,我们可以使用数据流图(Data Flow Graph)来描述矩阵运算的流程,将各个运算模块连接起来,形成一个完整的SVD分解电路。 最后,我们可以使用仿真工具对Verilog代码进行测试和验证。通过输入一些测试用例,验证SVD分解的正确性和性能。 综上所述,SVD分解在Verilog中的应用可以帮助我们优化数字电路的设计和实现。通过模块化的方法,我们可以将SVD分解的各个步骤进行拆解和实现,进而提高电路的速度和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值