使用eigen c ++计算AX = 0的非平凡解

时间:2013-11-13 07:24:07

标签: c++ eigen linear

如何使用特征线性代数库得到M*x=0的非平凡解。 我试过了,但解决方案全是零。

Matrix<float,2,3> m ;
Matrix<float,2,1> y ;
m << 2 , 3 ,5 , -4 , 2, 3;
y(0,0) = 0;
y(1,0) = 0;
cout << "Here is matrix m:" << endl << m << endl;
cout << "Here is matrix y:" << endl << y << endl;
cout<<"solution: \n"<<m.fullPivLu().solve(y);

2 个答案:

答案 0 :(得分:2)

你想在矩阵的内核中找到一个非零元素(内核是x的集合,使得Mx = 0),在Eigen中查找提供kernel()方法的分解,例如fullPivLu:< / p>

http://eigen.tuxfamily.org/dox/classEigen_1_1FullPivLU.html#a6e8f1d2fcbd86d3dc5a8a013b6e7200a

答案 1 :(得分:1)

您正在尝试解决M * x = 0,因此返回x=0是有意义的。如果您想避免这个简单的解决方案,那么您必须添加其他约束。例如,您可能会说要最小化|M * x|^2 |x|=1,在这种情况下,您最终会遇到特征值问题(通过拉格朗日乘数)。您的解决方案是对应于最小特征值的特征向量。使用特征:

Matrix3f A = m.adjoint() * m;
Vector3f x = SelfAdjointEigenSolver<Matrix3f>(A).eigenvectors().col(0);

我得到:

x = 0.032739  0.851202 -0.523816

m * x的顺序为1e-16