【数学问题2】QR分解

问题描述

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]]

结论

两者结果一致

发布了75 篇原创文章 · 获赞 722 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_41045354/article/details/105601677