正交矩阵
QR分解把矩阵分解成一个正交矩阵与一个上三角矩阵的积。QR分解经常用来解线性最小二乘法问题。
QR分解也是特定特征值算法即QR算法的基础。
实数矩阵A的QR分解是把A分解为 A = Q R , {\displaystyle A=QR,\,} A=QR,
这里的Q是正交矩阵(意味着QTQ = I)而R是上三角矩阵。类似的,我们可以定义A的QL, RQ和LQ分解。
更一般的说,我们可以因数分解复数 m × n {\displaystyle m} × {\displaystyle n} m×n矩阵(有着m ≥ n)为 m × n {\displaystyle m} × {\displaystyle n} m×n 幺正矩阵(在 Q ∗ Q = I Q^∗Q = I Q∗Q=I的意义上)和 m × n {\displaystyle m} × {\displaystyle n} m×n 上三角矩阵的乘积。
如果A是非奇异的,且限定R 的对角线元素为正,则这个因数分解是唯一的。
1、householderQ()
该方法返回矩阵Q的表达式作为Householder变换的序列。
返回的表达式可以直接用于执行矩阵乘积。 也可以将其分配给密集的Matrix对象。
这是显示如何恢复完整或稀疏矩阵Q以及如何使用算子*执行矩阵乘积的示例:
MatrixXf A(MatrixXf::Random(5,3)), thinQ(MatrixXf::Identity(5,3)), Q;
A.setRandom();
HouseholderQR<MatrixXf> qr(A);
Q = qr.householderQ();
thinQ = qr.householderQ() * thinQ;
std::cout << "The complete unitary matrix Q is:\n" << Q << "\n\n";
std::cout << "The thin matrix Q is:\n" << thinQ << "\n\n";
output:
The complete unitary matrix Q is:
-0.676 0.0793 0.713 -0.0788 -0.147
-0.221 -0.322 -0.37 -0.366 -0.759
-0.353 -0.345 -0.214 0.841 -0.0518
0.582 -0.462 0.555 0.176 -0.329
-0.174 -0.747 -0.00907 -0.348 0.539
The thin matrix Q is:
-0.676 0.0793 0.713
-0.221 -0.322 -0.37
-0.353 -0.345 -0.214
0.582 -0.462 0.555
-0.174 -0.747 -0.00907
2、solve()
此方法找到方程Ax = b的解x,其中A是矩阵*这是QR分解(如果存在)
这种方法只是试图找到尽可能好的解决方案。 如果要检查解决方案是否存在或是否正确,只需调用此函数以获取结果,然后计算该结果的错误,或直接使用MatrixBase :: isApprox(),例如:
bool a_solution_exists = (A*result).isApprox(b, precision);
求解示例:
typedef Matrix<float,3,3> Matrix3x3;
Matrix3x3 m = Matrix3x3::Random();
Matrix3f y = Matrix3f::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the matrix y:" << endl << y << endl;
Matrix3f x;
x = m.householderQr().solve(y);
assert(y.isApprox(m*x));
cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
# output:
Here is the matrix m:
0.68 0.597 -0.33
-0.211 0.823 0.536
0.566 -0.605 -0.444
Here is the matrix y:
0.108 -0.27 0.832
-0.0452 0.0268 0.271
0.258 0.904 0.435
Here is a solution x to the equation mx=y:
0.609 2.68 1.67
-0.231 -1.57 0.0713
0.51 3.51 1.05
利用qr 求解 Ax=y
Matrix3f m = Matrix3f::Random();
Matrix3f y = Matrix3f::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the matrix y:" << endl << y << endl;
Matrix3f x;
x = m.colPivHouseholderQr().solve(y);
assert(y.isApprox(m*x));
cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
其中解是否存在判断一样
bool a_solution_exists = (A*result).isApprox(b, precision);
Matrix3f m = Matrix3f::Random();
Matrix3f y = Matrix3f::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Here is the matrix y:" << endl << y << endl;
Matrix3f x;
x = m.fullPivHouseholderQr().solve(y);
assert(y.isApprox(m*x));
cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
# output:
Here is the matrix m:
0.68 0.597 -0.33
-0.211 0.823 0.536
0.566 -0.605 -0.444
Here is the matrix y:
0.108 -0.27 0.832
-0.0452 0.0268 0.271
0.258 0.904 0.435
Here is a solution x to the equation mx=y:
0.609 2.68 1.67
-0.231 -1.57 0.0713
0.51 3.51 1.05
通过特征分解求反(逆)矩阵
对称矩阵
正规矩阵
# code:
Eigen::Matrix2d matrix_22;
matrix_22 << 2,3,2,1;
cout << "matrix = \n"<< matrix_22<<endl;
//Eigen::SelfAdjointEigenSolver eigen_solver1 ( matrix_22 );/这句是啥不清楚
Eigen::EigenSolver<Eigen::Matrix2d> eigen_solver ( matrix_22 );
cout << "matrix values = \n" << eigen_solver.eigenvalues() << endl;//形式为二维向量(4,0)和(-1,0)。真实值为4,-1。
cout << "matrix vectors = \n" << eigen_solver.eigenvectors() << endl;//输出为单位化之后的。形式如下:
# output:
matrix =
2 3
2 1
matrix values =
(4,0)
(-1,0)
matrix vectors =
(0.83205,0) (-0.707107,0)
(0.5547,0) (0.707107,0)
有一个 × 的实数矩阵,我们想要把它分解成如下的形式