C++ 如何利用特征库计算矩阵的右核?
我已经开始用特征库实现一个算法。我需要计算矩阵的零空间(内核)。我试过用立方体的矩阵C++ 如何利用特征库计算矩阵的右核?,c++,matrix,eigen,eigen3,C++,Matrix,Eigen,Eigen3,我已经开始用特征库实现一个算法。我需要计算矩阵的零空间(内核)。我试过用立方体的矩阵 0, 0, 1, 0, 1, 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0 然后我打电话, 但是,我后来意识到它的右内核和左内核是相同的,似乎代码片段计算的是左内核。代码在另一个测试用例上得到了疯狂的输出。那么,如何计算正确的内核呢?还将通过示例显示btw右内核和左内核之间的差异。但是,如果删除第一行,则输出为0 很明显,这个案子的问题是 M
0, 0, 1,
0, 1, 0,
1, 0, 0,
-1, 0, 0,
0, 0, -1,
0, -1, 0
然后我打电话,
但是,我后来意识到它的右内核和左内核是相同的,似乎代码片段计算的是左内核。代码在另一个测试用例上得到了疯狂的输出。那么,如何计算正确的内核呢?还将通过示例显示btw右内核和左内核之间的差异。但是,如果删除第一行,则输出为0
很明显,这个案子的问题是
MatrixXf A{10, 3};
A <<
1, 0, 1 ,
1, 0, 0 ,
0, 1, 1 ,
0, 1, 0 ,
0, 0, 1 ,
-1, 0, 0 ,
0, 0, -1 ,
0, -1, 1 ,
0, -1, 0 ,
-1, 0, 1;
QR分解
HouseholderQR<MatrixXf> qr(A);
cout << "\nQR matrix to compare \n" << qr.matrixQR().transpose();
@编辑2,特征值是否计算错误?
@编辑3
我真的很困惑,因为这两个矩阵似乎都是对的!为什么会这样?
正如您所观察到的,这两个矩阵都是有效的右核。这是因为它们对应于相同子空间的两个不同基。要检查它,您可以将两个矩阵简化为简化的行梯队形式(matlab中的rref函数,或参见此)。此转换是唯一的,不会更改矩阵定义的范围。您的参考内核基础已在此表单中。因此,您所要做的就是减少Eigen返回的矩阵,并确保它提供与参考矩阵相同的矩阵。我已经编辑了代码,实际上就是我所做的。你能再看一遍吗?我想这算对了。但是为什么圣人的输出包括2。有趣的是,除非你要求核有一个酉基,否则矩阵K不是唯一的。我在矩阵计算方面不如你。那么,你建议我如何获得输出呢?我之前评论的目的只是解释为什么期望得到不同的结果,但它们可能都代表相同的子空间(我没有检查)。如果要检查,可以计算K的QR分解,并比较矩阵Q。
MatrixXf A{10, 3};
A <<
1, 0, 1 ,
1, 0, 0 ,
0, 1, 1 ,
0, 1, 0 ,
0, 0, 1 ,
-1, 0, 0 ,
0, 0, -1 ,
0, -1, 1 ,
0, -1, 0 ,
-1, 0, 1;
1 0 0 0 0 0 0 -2 2 1
0 1 0 0 0 0 0 -1 1 1
0 0 1 0 0 0 0 -1 2 0
0 0 0 1 0 0 0 0 1 0
0 0 0 0 1 0 0 -1 1 0
0 0 0 0 0 1 0 1 -1 -1
0 0 0 0 0 0 1 1 -1 0
HouseholderQR<MatrixXf> qr(A);
cout << "\nQR matrix to compare \n" << qr.matrixQR().transpose();
-1.41421 0 0.414214
-0.707107 -0.707107 -1
-0.707107 0.707107 1
0 0 1
-0.707107 0.707107 0
0.707107 0.707107 0
0.707107 -0.707107 0
-0.707107 0.707107 -1
0 0 -1
1.19209e-07 1.41421 5.96046e-08