今天在學習最小二乘法的時候遇到了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也就不是我們想要的單位矩陣了