[英]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.