Fastest method in inverse of matrix

后端 未结 1 1142
离开以前
离开以前 2021-01-06 18:35

I want to process Images with Inverse function and lot of functions. For code to run fastly can any one suggest fast method among the 3 inversion methods ?

d         


        
相关标签:
1条回答
  • 2021-01-06 18:57

    In OpenCV2.x, there's a new interface called Mat::inv(int method) to compute the inverse of a matrix. See reference.

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

    Parameters: method –

       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.
    

    I made a test with each of the method, it shows that DECOMP_CHOLESKY is the fastest for the test case, and LU gives the similar result.

    #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);
    }
    

    Here is the running resutls:

    LU:0.000423759

    DECOMP_SVD:0.0583525

    DECOMP_CHOLESKY:9.3453e-05

    0 讨论(0)
提交回复
热议问题