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.
出了什么问题在我使用,使原来的对称矩阵计算失败?
如果矩阵每个地方都包含小的正值(对角线上只有零),那么每行的总和是否为零? –