您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

矩阵逆的最快方法

矩阵逆的最快方法

在OpenCV2.x中,有一个称为Mat::inv(int method)计算矩阵逆的新接口。请参阅参考

C ++:MatExpr Mat :: inv(int method = DECOMP_LU)const

参数:方法

   Matrix inversion method. Possible values are the following:
        DECOMP_LU is the LU decomposition. The matrix must be non-

singular. DECOMP_CHOLESKY is the Cholesky LL^T decomposition for symmetrical positively defined matrices only. This type is about twice faster than LU on big matrices. DECOMP_SVD is the SVD decomposition. If the matrix is singular or even non-square, the pseudo inversion is computed.

我对每种方法进行了测试,结果表明DECOMP_CHOLESKY对于测试用例最快,LU提供了类似的结果。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

int main(void)
{
    cv::Mat img1 = cv::imread("2.png");
    cv::Mat img2, img3, img;
    cv::cvtColor(img1, img2, CV_BGR2GRAY);
    img2.convertTo(img3, CV_32FC1);
    cv::resize(img3, img, cv::Size(200,200));

    double freq = cv::getTickFrequency();

    double t1 = 0.0, t2 = 0.0;
    t1 = (double)cv::getTickCount();
    cv::Mat m4 = img.inv(cv::DECOMP_LU);
    t2 = (cv::getTickCount()-t1)/freq;
    std::cout << "LU:" << t2 << std::endl;

    t1 = (double)cv::getTickCount();
    cv::Mat m5 = img.inv(cv::DECOMP_SVD);
    t2 = (cv::getTickCount()-t1)/freq;
    std::cout << "DECOMP_SVD:" << t2 << std::endl;

    t1 = (double)cv::getTickCount();
    cv::Mat m6 = img.inv(cv::DECOMP_CHOLESKY);
    t2 = (cv::getTickCount()-t1)/freq;
    std::cout << "DECOMP_CHOLESKY:" << t2 << std::endl;

    cv::waitKey(0);
}

这是正在运行的结果:

LU:0.000423759

DECOMP_SVD:0.0583525

DECOMP_CHOLESKY:9.3453e-05

其他 2022/1/1 18:16:12 有418人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶