私はEigenライブラリでアルゴリズムの実装を開始しました。行列の空白(カーネル)を計算する必要がありました。私はその後、Eigenライブラリを使って行列の右カーネルを計算するには?
0, 0, 1,
0, 1, 0,
1, 0, 0,
-1, 0, 0,
0, 0, -1,
0, -1, 0
が、私は後でその上でその権利カーネルを実現し、
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
、私は入手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;
、呼び出ししかし、それ、キューブの行列で試してみましたし、左のカーネルは同じで、コードスニペットは左のカーネルを計算しているようです。コードがもう一方のテストケースで狂った出力になっています。だから、どのように右のカーネルを計算することができますか? The linkは、例の右と左のカーネルの違いを表示することです。私は最初の行を削除する場合は、出力は例の問題は
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因数分解、0 0 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
@編集2,Eigenは間違って計算されますか?
@Edit 3、私は本当に両方の行列は、右のように見えるので、本当に困惑している
!どうして?
コードを編集しました。実際に行ったことです。もう一度見ていただけますか? – snr
私はそれが正しいと思う。 [Wolframalpha](https://m.wolframalpha.com/input/?i=null+space+of+%7B%5B1%2C+0%2C+1%5D%2C+%5B1%2C+0%2C+0 2C + 1%5D%2C + 1%2C + 0%5D%2C +%5B0%2C + 0%2C + 1%5D%2C +%5B-1 %2C + 0%2C + 0%5D%2C +%5B0%2C + 0%2C + -1%5D%2C +%5B0%2C + -1%2C + 1%5D%2C +%5B0%2C + -1%2C + 0 %5D%2C +%5B-1%2C + 0%2C + 1%5D%7D)。しかし、なぜセイジの出力に2が含まれているのですか?おもしろい。 – snr
カーネルに単一の基底を持つように指定しない限り、行列Kは一意ではありません。 – ggael