问题描述
eigen
int main() {
Matrix3f A;
A << 1, 1, 1,
2, -1, -1,
2, -4, 5;
vec3 F;
F << 2, 2, 2;
//Eigen::ColPivHouseholderQR<Matrix3f> qr;
Eigen::HouseholderQR<Matrix3f> qr;
qr.compute(A);
MatrixXf R = qr.matrixQR().triangularView<Eigen::Upper>();
MatrixXf Q = qr.householderQ();
MatrixXf out;
out = qr.solve(F);
cout << "QR2(): HouseholderQR---------------------------------------------" << endl;
cout << "A " << std::endl << A << endl << endl;
cout << "qr.matrixQR()" << endl << qr.matrixQR() << endl << endl;
cout << "R" << endl << R << endl << endl;
cout << "Q " << endl << Q << endl << endl;
cout << "Q*R" << endl << Q * R << endl << endl;
cout << "qr_solve" << endl << out << endl;
getchar();
return 0;
}
输出结果:
A*F:
6
0
6
QR2(): HouseholderQR---------------------------------------------
A
1 1 1
2 -1 -1
2 -4 5
qr.matrixQR()
-3 3 -3
0.5 -3 3
0.5 -1 -3
R
-3 3 -3
0 -3 3
0 0 -3
Q
-0.333333 -0.666667 -0.666667
-0.666667 -0.333333 0.666667
-0.666667 0.666667 -0.333333
Q*R
1 1 1
2 -1 -1
2 -4 5
qr_solve
1.33333
0.444445
0.222222
numpy
A = np.array([[1, 1, 1], [2, -1, -1], [2, -4, 5]])
b = np.array([2, 2, 2]).reshape([3, 1])
q, r = np.linalg.qr(A)
print('\n\nq:\n', q)
print('\n\nr:\n', r)
x = np.linalg.solve(A, b)
print(x)
输出结果
q:
[[-0.33333333 -0.66666667 -0.66666667]
[-0.66666667 -0.33333333 0.66666667]
[-0.66666667 0.66666667 -0.33333333]]
r:
[[-3. 3. -3.]
[ 0. -3. 3.]
[ 0. 0. -3.]]
q*r:
[[ 1. 1. 1.]
[ 2. -1. -1.]
[ 2. -4. 5.]]
qr_slove:
[[1.33333333]
[0.44444444]
[0.22222222]]
结论
两者结果一致