【问题标题】:How to compute right kernel of a matrix with Eigen library?如何使用 Eigen 库计算矩阵的右核?
【发布时间】:2018-04-27 08:47:52
【问题描述】:

我已经开始使用 Eigen 库实现算法。我需要计算矩阵的零空间(内核)。我尝试过使用立方体的矩阵,

0, 0, 1,   
0, 1, 0,   
1, 0, 0,   
-1, 0, 0,    
0, 0, -1,   
0, -1, 0

然后,我打电话给its source

A.transposeInPlace();
std::cout << "and after being transposed:\n" << A << std::endl;
FullPivLU<MatrixXf> lu(A);
MatrixXf A_null_space = lu.kernel();
std::cout << "Null space:\n" << A_null_space << std::endl;
A_null_space.transposeInPlace();
std::cout << "Null space Transposed_A:\n" << A_null_space;

我得到,

 0.5    0   -1    1    0    0    0    0    0  0.5
-0.5    0   -0    0    1    0    0    0    0 -0.5
 0.5    0   -0    0    0    1    0    0    0 -0.5
 0.5    0   -0    0    0    0    1    0    0  0.5
  -1    0    1    0    0    0    0    1    0   -1
-0.5    0    1    0    0    0    0    0    1 -0.5
-0.5    1   -0    0    0    0    0    0    0  0.5

但是,后来我意识到它的右内核和左内核是相同的,并且看起来代码 sn-p 计算左内核。代码在另一个测试用例上得到了疯狂的输出。那么,如何计算正确的内核The link 还通过示例显示左右内核的差异。但是,如果我删除第一行,则输出为 0 0 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;

它的输出预期为,

 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

QR 分解,

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

@Edit 2,Eigen计算错误吗?

Source

@编辑 3,

我真的很困惑,因为这两个矩阵看起来都是正确的!怎么会?

【问题讨论】:

    标签: c++ matrix eigen eigen3


    【解决方案1】:

    正如您所观察到的,这两个矩阵都是有效的右核。这是因为它们对应于 same 子空间的两个不同的基。要检查它,您可以将两个矩阵简化为简化的行梯形形式(matlab 中的 rref 函数,或参见此online calculator)。这种变换是唯一的,不会改变矩阵定义的跨度。您的参考内核基础已经采用这种形式。所以你所要做的就是减少 Eigen 返回的那个,看看它给你的矩阵和你的参考矩阵一样。

    【讨论】:

    • 我已经编辑了代码,实际上是我所做的。你能再看一遍吗?
    • 我认为它计算正确。 Wolframalpha。但是为什么圣人的输出包括2s。有趣..
    • 除非你强制要求内核有一个单一的基础,否则矩阵 K 不是唯一的。
    • 我的矩阵计算不如你。那么,你建议我如何获得输出?
    • 我之前评论的目的只是解释为什么期望您得到不同的结果,但它们可能都代表相同的子空间(我没有检查)。如果要检查,可以计算 K 的 QR 分解并比较矩阵 Q。
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多