2017-11-14 15 views
3

Ich habe mit der Implementierung eines Algorithmus mit Eigenbibliothek begonnen. Ich musste Nullraum (Kern) einer Matrix berechnen. Ich habe mit einer Würfelmatrix versucht, dieWie berechne ich den richtigen Kern einer Matrix mit einer Eigenen Bibliothek?

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

Dann rufe ich, 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; 

I erhalten,

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 

Aber ich erkannte später, dass ihr Recht Kernel und Der linke Kernel ist der gleiche und scheinbar berechnet der Code-Snippet den linken Kernel. Der Code wird bei dem anderen Testfall verrückt. Also, wie kann der richtige Kernel berechnet werden? The link soll auch den Unterschied zwischen rechten und linken Kernel mit Beispielen zeigen. Allerdings, wenn ich erste Zeile entfernen, ist der Ausgang 0 0 0

Offensichtlich Problem des Falles ist,

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; 

Sein Ausgang wie erwartet,

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-Faktorisierung,

HouseholderQR<MatrixXf> qr(A); 
    cout << "\nQR matrix to compare \n" << qr.matrixQR().transpose(); 

Dann bekomme ich,

-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, Berechnet Eigen falsch?

enter image description here

Source

@Edit 3,

ich wirklich bin, aber wirklich verwirrt, weil beide Matrix richtig zu sein! Woher?

enter image description here

Antwort

0

Wie Sie beobachtet, sind beide Matrizen geltendes Recht Kernel. Dies liegt daran, dass sie zwei unterschiedlichen Basiswerten des gleichen Unterraums entsprechen. Um dies zu überprüfen, können Sie die zwei Matrizen auf die reduzierte Zeilen-Staffelform reduzieren (Rref-Funktion in Matlab, oder sehen Sie dies online calculator). Diese Transformation ist einzigartig und ändert nicht die durch die Matrix definierte Spanne. Ihre Referenz-Kernel-Basis ist bereits in dieser Form. Alles, was Sie tun müssen, ist, die von Eigen zurückgegebene zu reduzieren und zu sehen, dass Sie dieselbe Matrix wie Ihre Referenz erhält.

+0

Ich habe den Code bearbeitet, was ich tat. Könntest du nochmal durchsehen? – snr

+0

Ich denke, es berechnet richtig. [Wolframalpha] (https://m.wolframalpha.com/input/?i=null+space+of+%7B%5B1%2C+0%2C+1%5D%2C+%5B1%2C+0%2C+0 % 5D% 2C +% 5BO% 2C + 1% 2C + 1% 5D% 2C +% 5BO% 2C + 1% 2C + 0% 5D% 2C +% 5BO% 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). Aber warum die Ausgabe des Weisen enthält die 2s. Interessant .. – snr

+0

Wenn Sie keine unitäre Basis für den Kernel haben, ist die Matrix K nicht eindeutig. – ggael

Verwandte Themen