Причины, по которым умножение симметричной матрицы на диагональную матрицу возвращает несимметричную матрицу

Я столкнулся со странной проблемой при использовании Breeze, и я хотел бы знать, каковы могут быть возможные причины.

У меня есть симметричная матрица, содержащая только небольшие положительные значения. Мне нужно получить собственные значения и собственные векторы нормализованной матрицы, поэтому я использую:

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.

Что может быть не так в исходной симметричной матрице, которую я использую, чтобы вычисление не получилось?


person Armand Grillet    schedule 12.07.2016    source источник


Ответы (1)


Предположим, что sum() дает ноль. Возведение этого числа в степень -0,5 дает бесконечность с плавающей запятой в диагональной матрице; последующий продукт дает матрицу, содержащую NaN. Технически эта матрица симметрична, но реальный код для проверки не может быть успешным, потому что он будет проверять NaN на равенство с NaN, который всегда возвращает FALSE.

Что касается случайной проверки: обратите внимание, что случайная матрица вряд ли даст ноль в sum().

person PMar    schedule 12.07.2016
comment
Как может сумма каждой строки давать нуль, если матрица везде содержит небольшие положительные значения (только нули по диагонали)? - person Armand Grillet; 12.07.2016