У меня возникает странная проблема при использовании 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
симметрична.
Чтобы найти, где ошибка, я попытался вычисления при создании случайных версий 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.
Что может быть плохого в исходной симметричной матрицы я использую, чтобы сделать вычисление терпит неудачу?
Как сумма каждой строки дает нуль, так как матрица содержит малые положительные значения всюду (единственные нули, находящиеся в диагонали)? –