2017-11-14 5 views
3

私は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は間違って計算されますか?

enter image description here

Source

@Edit 3、私は本当に両方の行列は、右のように見えるので、本当に困惑している

!どうして?

enter image description here

答えて

0

あなたが観察されたように、両方の行列は、有効な権利のカーネルです。これは、それらが同じ部分空間の2つの異なる基底に対応するためです。これを確認するには、2つの行列を縮小行エシェロン形式(matlabのrref関数、またはonline calculatorを参照)に減らすことができます。この変換は一意であり、行列によって定義された範囲を変更しません。参照カーネルの基礎はすでにこの形式です。だからあなたがしなければならないのは、Eigenから返されたものを減らして、それがあなたの参照と同じ行列を与えることを確認することです。

+0

コードを編集しました。実際に行ったことです。もう一度見ていただけますか? – snr

+0

私はそれが正しいと思う。 [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

+0

カーネルに単一の基底を持つように指定しない限り、行列Kは一意ではありません。 – ggael

関連する問題