本篇介紹如何使用eigen求解線性最小二乘系統。
乙個系統可能無精確的解,比如ax=b
的線性方程序,不存在解。這時,找到乙個最接近的解x
,使得偏差ax-b
盡可能地小,能夠滿足誤差要求error-margin
。那這個x
就稱為最小二乘解。
這裡討論3個方法: svd分解法,qr分解法,和規範等式。這中間,svd分解法精度最高,但效率最差;規範式最快但精度最小;而qr分解法居中。
使用eigen中的bdcsvd類
的的solve()
方法,就能直接解出線性二乘系統了。但對奇異值計算,這樣並不足夠,你也會需要計算奇異向量。
示例如下,其使用了matrix的bdcsvd()
方法來建立乙個bdcsvd類的例項:
#include
#include
using
namespace std;
using
namespace eigen;
intmain()
執行:
$ g++ -i /usr/local/include/eigen3 matrix_svd1.cpp -o matrix_svd1
$ $ ./matrix_svd1
here is the matrix a:
-0.999984 -0.0826997
-0.736924 0.0655345
0.511211 -0.562082
here is the right hand side b:
-0.905911
0.357729
0.358593
the least-squares solution is:
0.46358
0.0429898
在eigen中,qr分解類的solve()
方法用於計算最小二乘解。eigen內提供了3中qr分解類:
matrixxf a = matrixxf::
random(3
,2);
vectorxf b = vectorxf::
random(3
);cout <<
"the solution using the qr decomposition is:\n"
<< a.
colpivhouseholderqr()
.solve
(b)<< endl;
有變換等式轉換: ax=
bax = b
ax=b
⇒ atax
=atb
a^tax = a^tb
atax=a
tb, 這裡對矩陣a有要求,ata
a^ta
ata結果為方陣,如果矩陣的條件比較病態,則計算可能會急劇變大,考慮matrixxf(1000,2),需要計算乙個1000x1000的矩陣了。
下面示例:
//matrix_decom_norm.cpp
#include
#include
using
namespace std;
using
namespace eigen;
intmain()
執行:
$ g++ -i /usr/local/include/eigen3 matrix_decom_norm.cpp -o matrix_decom_norm
$ ./matrix_decom_norm
a: -0.999984 -0.0826997
-0.736924 0.0655345
0.511211 -0.562082
b: -0.905911
0.357729
0.358593
the solution using normal equations is:
0.463581
0.0429899
Eigen使用稀疏矩陣求解線性方程
eigen稀疏矩陣求解線性方程,內建的有直接求解器,迭代求解器和第三方求解器。見文件 圖二見鏈結 這裡是使用eigen裡的迭代求解器,因為矩陣非方陣,也不是對稱的,選擇leastsquaresconjugategradient。1 包含標頭檔案 include eigen sparse includ...
《演算法》蛇形矩陣求解
蛇形矩陣 右下,下左,左上,上右,迴圈往復 如果每次迴圈都計算x,y當前的極限值會很耗費效能,不如讓x和y直接越界,當越界的點不存在時,再回退一步,並按照 對方 上次的極限值 最大或最小 去確定 正確的轉向方向 左或右 import time import sys x變化或y變化 x和y只能有乙個工...
MATLAB求解矩陣函式
3.一般矩陣運算函式不可用 4.矩陣函式求解函式funm 5.多多點贊關注,多多交流 這裡的 1 2 節涉及到矩陣函式的一般求法。第 3 節演示了為什麼不能用普通的運算函式求矩陣函式。第 4 節介紹了matlab內建的矩陣函式求解函式。如果趕時間,直接看第 4 節即可!總的來說,矩陣函式的求解方式和...