2017-12-14 4 views
0

Mit Brise 0.13, Scala 2.12.3Brise Kopie unteres Dreieck funktioniert nicht?

Ich möchte eine symmetrische Matrix erstellen, indem Sie das untere Dreieck in das obere Dreieck kopieren. Folgen Sie den Anweisungen in Linear Algebra Cheat Sheet. Möglicherweise verwende ich die Funktion falsch, aber es scheint, als ob die lowerTriangular Funktion nicht richtig funktioniert. Die Kopie nur

val myMtx = breeze.linalg.DenseMatrix((1,-8,-9) , (2,1,-7), (3,5,1)) 
//myMtx: breeze.linalg.DenseMatrix[Int] = 
// 1 -8 -9 
// 2 1 -7 
// 3 5 1 

Copy unteres Dreieck (scheint nicht funktioniert)

breeze.linalg.lowerTriangular(myMtx) 
// 1 0 0 
// 2 1 0 
// 3 5 1 

Kopieren oberes Dreieck (ebenfalls nicht arbeiten)

breeze.linalg.upperTriangular(myMtx) 
// 1 -8 -9 
// 0 1 -7 
// 0 0 1 

Antwort

0

In diesem Zusammenhang "Kopieren" bedeutet, kehrt die Matrix in einem neu zugewiesenen Speicher. Dies steht im Gegensatz zu einer "Ansicht", die in denselben Hintergrundspeicher indiziert.

In diesem Sinne scheinen sowohl das untere Triangular als auch das obere Triangular korrekt zu funktionieren, da es eine neue Matrix zurückgibt, die die gleichen Elemente aus der ursprünglichen Matrix kopiert hat.

Die Aufgabe besteht nun darin, eine neue symmetrische Matrix zu erstellen, die die Kopie des unteren Dreiecks ist. Ein möglicher Weg besteht darin, die elementweise Summe der unteren und unteren diagonalen Transponierten zu berechnen und dann die zusätzliche Kopie der berechneten Diagonalen zu subtrahieren. Das innere diag() gibt eine Ansicht, wie oben beschrieben, als einen Vektor zurück, und dieser Vektor wird dann verwendet, um eine diagonale Matrix mit dem zweiten diag() zu erzeugen.

@ val sym = lowerTriangular(myMtx) + lowerTriangular(myMtx).t - diag(diag(myMtx)) 
sym: DenseMatrix[Int] = 
1 2 3 
2 1 5 
3 5 1 
+0

Vielen Dank für die Klärung der Definition der unteren Triangular und oberen Triangular. Wie sehr der Trick mit 'diag (diag (myMtx))' – Polymerase

Verwandte Themen