2016-07-12 11 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は対称です。

// 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. 

私が作るために使用しています、元の対称行列に間違っている可能性がどのような:エラーで、aのランダムなバージョンを作成するときに、私は計算を試してみましたし、その場合にはそれが働く場所を見つけるに

計算が失敗しますか?

答えて

0

sum()がゼロを生成しているとします。それをpower-0.5にすると、対角行列に浮動小数点Infinityが生成されます。次の生成物はNaNを含むマトリックスを生成する。技術的にはこの行列は対称ですが、テストする実際のコードは成功しません。なぜなら、NaNがNaNと等しいかどうかをテストします.NaNは常にFALSEを返します。

ランダムチェックについて:ランダム行列はsum()にゼロを返す可能性が低いことに注意してください。

+0

どのように行列が小さな正の値を含んでいるので、各行の合計はゼロになりますか(唯一の対角は対角にあります)? –

関連する問題