2016-07-12 16 views
0

Ich stoße auf ein seltsames Problem bei der Verwendung von Breeze, und ich würde gerne wissen, was die möglichen Gründe sein könnten.Gründe, warum das Multiplizieren einer symmetrischen Matrix mit einer diagonalen Matrix eine unsymmetrische Matrix ergibt

Ich habe a symmetric matrix, nur kleine positive Werte enthalten. Ich brauche die Eigenwerte und Eigenvektoren der normalisierten Matrix erhalten also ich bin mit:

val dataset = new File(getClass.getResource("/matrix.csv").getPath()) 
val a = breeze.linalg.csvread(dataset) 
val diagA = diag(pow(sum(a(*, ::)), -0.5)) 
val b = diagA * a * diagA // Multiplying a symmetric matrix with a diagonal matrix should still give a diagonal matrix. 
println(eigSym(b)) 

dies tun gibt [error] (run-main-0) breeze.linalg.MatrixNotSymmetricException: Matrix is not symmetric.

Wenn ich eigSym(a) berechnen nach a es aus matrix.csv Lesen wird es funktionieren so bin ich sicher, dass a symmetrisch ist.

zu finden, wo der Fehler, ich habe die Berechnung versucht haben, wenn zufällige Versionen von a und in diesem Fall die Schaffung es funktioniert:

// Creation of a big symmetric matrix. 
var a = DenseMatrix.rand(240, 240) 
var row, col = 0 
for (row <- 0 until a.rows) { 
    for (col <- row until a.cols) { 
     if (col == row) { 
      a(row, col) = 0.0 
     } else { 
      a(col, row) = a(row, col) 
     } 
    } 
} 

println(eigSym(a)) // Works. 

// Same diagA as before. 
val diagA = diag(pow(sum(a(*, ::)), -0.5)) 
val b = diagA * a * diagA 
println(eigSym(b)) // Also works. 

Was in der ursprünglichen symmetrischen Matrix falsch sein könnte ich bin mit zu die Berechnung scheitert?

Antwort

0

Angenommen, die Summe() ergibt eine Null. Erhebt man dies auf die Potenz -0,5, so entsteht in der Diagonalmatrix eine Gleitkomma-Unendlichkeit; das nachfolgende Produkt erzeugt eine Matrix, die NaN enthält. Technisch ist diese Matrix symmetrisch, aber der eigentliche zu testende Code kann nicht erfolgreich sein, weil er NaN auf Gleichheit mit NaN prüft, was immer FALSE zurückgibt.

Bei der Stichprobenprüfung: Beachten Sie, dass eine Zufallsmatrix wahrscheinlich keine Null in Summe() ergibt.

+0

Wie könnte die Summe jeder Zeile Null ergeben, da die Matrix überall kleine positive Werte enthält (die einzigen Nullen befinden sich in der Diagonalen)? –