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