2016-07-12 226 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

假设sum()产生一个零。将该值提高到-0.5,会在对角矩阵中产生浮点无穷大;随后的产品产生含有NaN的基质。从技术上讲,这个矩阵是对称的,但是测试的实际代码不能成功,因为它会测试NaN与NaN的相等性,NaN总是返回FALSE。

关于随机检查:请注意,随机矩阵不可能在sum()中产生零。

+0

如果矩阵每个地方都包含小的正值(对角线上只有零),那么每行的总和是否为零? –