2016-07-12 6 views
0

У меня возникает странная проблема при использовании 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. 

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

ответ

0

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

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

+0

Как сумма каждой строки дает нуль, так как матрица содержит малые положительные значения всюду (единственные нули, находящиеся в диагонали)? –

 Смежные вопросы

  • Нет связанных вопросов^_^