簡體   English   中英

如何使用特征庫計算矩陣的正確核?

[英]How to compute right kernel of a matrix with Eigen library?

我已經開始使用本征庫實現算法。 我需要計算矩陣的空空間(內核)。 我已經嘗試了一個立方體的矩陣,

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

然后,我叫它的來源

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

但是,我后來才意識到它的右內核和左內核是相同的,並且似乎代碼片段計算了左內核。 代碼在另一個測試用例上越來越瘋狂了。 那么,如何計算正確的內核 該鏈接還將通過示例顯示左右內核之間的差異。 但是,如果我刪除第一行,則輸出為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計算錯誤嗎?

在此處輸入圖片說明

資源

@Edit 3,

我真的但真的很困惑,因為兩個矩陣看起來都正確! 怎么會?

在此處輸入圖片說明

如您所見,這兩個矩陣都是有效的正確內核。 這是因為它們對應於同一子空間的兩個不同基礎。 要進行檢查,可以將兩個矩陣簡化為簡化的行梯形形式(matlab中的rref函數,或參見此在線計算器 )。 此變換是唯一的,不會更改矩陣定義的范圍。 您的參考內核基礎已經采用這種形式。 因此,您要做的就是減少Eigen返回的值,並看到它為您提供與參考值相同的矩陣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM