OpenCV solve() 解線性方程


今天在學習最小二乘法的時候遇到了solve函數,用來解線性方程 A*X=B

1 bool cv::solve 2 ( 3 InputArray src1, 4 InputArray src2, 5 OutputArray dst, 6 int     flags = DECOMP_LU 7 )    

src1 線性系統的左側(相當於上面的A),src2 線性系統的右側(相當於上面的B),dst 輸出的解決方案(相當於要求解的X),flag為使用的方法

上代碼

1     Mat A = (Mat_<float>(2, 2) << 1,2,3,4); 2     Mat B = (Mat_<float>(2, 1) <<5,11); 3  Mat C; 4     cout <<"A"<<endl<< A << endl; 5     cout << "B" << endl << B << endl; 6  solve(A, B, C, CV_LU); 7     cout << "X" << endl << C << endl;   

以下是結果

發現沒有問題,然后我們再測試下個例子,修改了輸入矩陣和輸出矩陣,顯而易見,一個矩陣乘單位矩陣是本身,X應該是單位矩陣,但是輸出結果卻出乎意料,竟然都是0

1 Mat A = (Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); 2 Mat B = (Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); 3 Mat C; 4 cout <<"A"<<endl<< A << endl; 5 cout << "B" << endl << B << endl; 6 solve(A, B, C, CV_LU); 7 cout << "X" << endl << C << endl;

再看了下官方文檔 

就是說我們使用CV_LU方法,如果src1不是奇異矩陣(奇異矩陣行列式為0 ,沒有逆矩陣)則返回1,否則返回0 ,於是我修改了下代碼

查看了下源碼,發現內部有判斷行列式是否為0,如果是0 ,則返回false

個人覺得是 A*X = B 

                X = A^-1 * B  

   A^-1 為A的逆矩陣 如果A是奇異矩陣 也就不存在逆矩陣 所以無法計算  所以我們上面求得的X也就不是我們想要的單位矩陣了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM