2014-02-28 32 views
0

我有一組矩陣形式的線性代數方程組,Ax = By。其中是和X矩陣是大小2036x13ÿ13x1的向量。 等級(A)= 20。因爲系統是超定的(有更多的方程數比變量),所以最小二乘解是可能的,我,e; x =(A^TA)^ - 1A^TBy。我想要解決方案,以便剩餘誤差e = Ax-By應該最小化。線性阿爾克馬爾方程的最小二乘解Ax = by Eigen C++

使用Eigen/Dense C++庫我已經制定了所有的矩陣等。

我猜這個頁面描述的方法只適用於方陣。因爲當它試圖運行它會給出錯誤。

x = A.jacobiSvd(ComputeThinU | ComputeThinV).solve(B*y); 

錯誤

/usr/include/eigen3/Eigen/src/SVD/JacobiSVD.h: In member function 'const  
Eigen::internal::solve_retval<Eigen::JacobiSVD<MatrixType, QRPreconditioner>, Rhs> 
Eigen::JacobiSVD<MatrixType, QRPreconditioner>::solve(const 
Eigen::MatrixBase<OtherDerived>&) const [with Rhs = 
Eigen::GeneralProduct<Eigen::Matrix<float, 36, 13>, Eigen::Matrix<double, -1, 1>, 4>; 
_MatrixType = Eigen::Matrix<float, 36, 20>; int QRPreconditioner = 2]': 
/usr/include/eigen3/Eigen/src/SVD/JacobiSVD.h:658:5: warning: control reaches end of 
non-void function [-Wreturn-type] 
make[2]: *** [src/CMakeFiles/spacebot_actuationKinematics.dir 
/ActuationKinematics.cpp.o] Error 1 
make[1]: *** [src/CMakeFiles/spacebot_actuationKinematics.dir/all] Error 2 
make: *** [all] Error 2 
+0

頁面支持QR分解。你試過了嗎?它也適用於最小二乘的矩形矩陣A以及SVD方法。您的錯誤來自於報告函數的一些特殊情況中缺少的return語句,請檢查Eigen的錯誤報告。 – LutzL

+0

你是什麼意思? LS方法是找到x的線性組合的參數,這些參數是觀察到的y觀察到的最佳擬合。所以你可以用x值和y值代入方程。你有36個觀察結果嗎? – 4pie0

+0

@LutzL是的我試過了。這是輸出。斷言失敗,因爲rows == cols。 ActuationKinematicsTest:/usr/include/eigen3/Eigen/src/LU/Inverse.h:334:const Eigen :: internal :: inverse_impl Eigen :: MatrixBase :: inverse()const [with Derived = Eigen :: Matrix ]:聲明'rows()== cols()'失敗。 Aborted(核心轉儲) –

回答

0

似乎是一個具有與你的解決(B * y)處的矩陣乘法的問題;部分。嘗試單獨做B * y並使用solve(result);代替。

Eigen::GeneralProduct<Eigen::Matrix<float, 36, 13>, Eigen::Matrix<double, -1, 1>, 4> 

這條線給了我這個懷疑。它說y變量的大小爲-1x1,因此你的程序不會運行,因爲它不能與矩陣相乘。

此外,教程說...

A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl; 

我不知道艾根是怎麼工作的,但是,這似乎是這個問題。

+0

如果矩陣「B」的順序是「m x n」,矢量「y」的順序是「p x q」,那麼對於「p == n」的乘法,在我的情況下總是如此。如果我們在參數容器外部或參數容器中進行乘法,有什麼區別?這一行沒有更多的問題。 QR分解適用於我的情況,但x的解決方案並不精確。因爲我的A,B任何y都隨時間變化。 –

+0

@wafeeq取決於方法重載,它如何取其參數。在括號內完成時可能無法解決乘法。我知道這些矩陣是正確的,從程序員的角度來看,似乎第二個arg沒有被正確處理,只要看看gcc的調試信息。我肯定會發現的唯一方法是通過深入研究特徵。 – Claudiordgz

0

如文檔中所述,ComputeThin*選項僅適用於Dynamic大小的矩陣。對於固定尺寸,您必須使用ComputeFull*。儘管如此,在您的情況下,最好使用Dynamic尺寸矩陣,即MatrixXf。固定大小的矩陣只適用於非常小的矩陣。

最後,ColPivHouseholderQR可能是最小二乘求解的更好選擇。 SVD有點矯枉過正。

+0

我猜這些矩陣無論是動態分配內存還是沒有。我已經在我的代碼中使用了MatrixXd。問題是最小二乘解的誤差是不可接受的。它的大。通過最小二乘法找到x的值後,error = Ax-By。 –