Breezeの使用中に奇妙な問題が発生しましたが、何が原因か分かりません。対称行列に対角行列を乗ずる理由が非対称行列を返す
私はa symmetric matrixですが、小さな正の値しか含んでいません。
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))
を[error] (run-main-0) breeze.linalg.MatrixNotSymmetricException: Matrix is not symmetric
を返し、これを行う:私が使用していますので、正規化された行列の固有値と固有ベクトルを取得する必要があります。
eigSym(a)
を読み取った後にa
を入力した場合は、matrix.csv
となりますので、a
は対称です。
// 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.
私が作るために使用しています、元の対称行列に間違っている可能性がどのような:エラーで、a
のランダムなバージョンを作成するときに、私は計算を試してみましたし、その場合にはそれが働く場所を見つけるに
計算が失敗しますか?
どのように行列が小さな正の値を含んでいるので、各行の合計はゼロになりますか(唯一の対角は対角にあります)? –