Eigen密集矩陣求解 2 求解最小二乘系統

2021-10-03 22:23:18 字數 2103 閱讀 9142

本篇介紹如何使用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 節即可!總的來說,矩陣函式的求解方式和...