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?
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)? –