1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#include <iostream>
#include <Eigen/Dense>
int main() {
Eigen::MatrixXd A(4, 4);
A << 4, 1, 0, 0,
1, 4, 1, 0,
0, 1, 4, 1,
0, 0, 1, 4;
Eigen::Vector4d b(1, 2, 3, 4);
// 对称正定矩阵:使用 LLT(Cholesky 分解)
// 要求:A 必须是对称正定的
Eigen::LLT<Eigen::MatrixXd> llt(A);
if (llt.info() == Eigen::Success) {
Eigen::VectorXd x = llt.solve(b);
std::cout << "LLT solution: " << x.transpose() << std::endl;
}
// 另一种:LDLT 分解(更稳定)
Eigen::LDLT<Eigen::MatrixXd> ldlt(A);
if (ldlt.info() == Eigen::Success) {
Eigen::VectorXd x = ldlt.solve(b);
std::cout << "LDLT solution: " << x.transpose() << std::endl;
}
// 非方阵:QR 分解
Eigen::MatrixXd B(4, 3);
B << 1, 2, 3,
4, 5, 6,
7, 8, 9,
10, 11, 12;
Eigen::Vector4d b2(1, 2, 3, 4);
Eigen::VectorXd x_qr = B.colPivHouseholderQr().solve(b2);
std::cout << "QR solution (least squares): " x_qr.transpose() << std::endl;
return 0;
}
|