2014-06-11 89 views
1

我試圖將一些MATLAB代碼,C++徵:解決A = XB(斷言失敗)

我使用Eigen這是一個夢幻般的庫(嘗試,如果你不知道)

但我想這行轉換:

x = B/A 

B = rand(7,20); 
A = rand(1,20); 

代碼在Matlab 工作沒有問題,它返回一個數組(1X7)

隨着艾根(這裏是代碼:

#include <Eigen/Core> 
#include <Eigen/Dense> 
#include <iostream> 

Matrix<double, Dynamic, Dynamic> A(7,20); 
Matrix<double, Dynamic, Dynamic> B(1,20); 
cout<< A.colPivHouseholderQr().solve(B); 

我得到了一個斷言失敗:

rhs.rows ()== dec.rows()

所以看來我只能解決系統的矩陣的相同的行數

我的數學有點有限,但有沒有辦法解決無論如何

我也試過這個代碼,而不是:

cout << (A.transpose() * A).ldlt().solve(A.transpose() * B) 

cout <<A.jacobiSvd(ComputeThinU | ComputeThinV).solve(B) 

感謝

傑夫

+0

嗯,在[文件](http://eigen.tuxfamily.org/dox/classEigen_1_1ColPivHouseholderQR .html#afbe1cd1202964011ae7e7411577749a0)說:「b是矩陣的情況尚未實現。」 –

+0

爲了尊重矩陣維數,你不應該假設'Ax = b'!='(7x20)x(1 x 7)=(1 x 20)'。但是(20x7)(7x1)=(20x1)'?除了你的系統是'xA = b',那個工作。 – Vuwox

回答

2

這裏的問題:

在MATLAB,B/Asolves the equationxA=B

在Eigen中,solve方法解決了方程Ax=B。在MATLAB中,這將表示爲x = A\B

這些是非常不同的 - 矩陣乘法是而不是交換!

通常,矩陣產品Ax具有與A相同的行數以及與x相同的列數。因此,對於等式Ax=B有意義,A必須具有與B相同的行數(這是您的斷言錯誤來自的地方)。

現在這兩個分別由數學B/A = (A'\B')'相關的,所以你可以這樣做(未經測試的代碼)

Matrix<double, Dynamic, Dynamic> C = A.transpose().fullPivLu().solve(B.transpose()); 
cout << C.transpose(); 
0

如果你看看mldivide

對於一個系統:Ax = b解決它你需要做的:x = A\B

所以在你的情況下,你正試圖解決:xA = b

那爲什麼在本徵矩陣維度不適合。