0

2 つの行列があります。

A:(6×78)max=22.2953324329113, min=0
B:(6×6) max=2187.9013214004 , min=-377.886378385521

Bは対称であり、その結果、C = A' * B * Aは (理論的には) 対称行列である必要がありますが、Matlab で計算する場合はそうではありません。実際には:

max(max(abs(C - C'))) = 2.3283064365386963e-010

それらを乗算して正確な結果を得るにはどうすればよいですか?
または
C の要素を丸める安全な方法は何ですか?

私はこの質問を読みました: effective-multiplication-of-very-large-matrices-in-matlabですが、私の問題は速度やメモリではありません。正確な結果が必要です

ありがとう。

4

2 に答える 2

2

B対称なのでのコレスキー分解を考えることができます

  B = R'R
  R = chol(A)   % // in matlab

次にC = A'R'R A =D'D、どこでD = RA

ではC=D'D、分解の精度によって誤差が生じる可能性がありますが、マシンのイプシロン精度が必要です。

于 2012-12-05T18:24:46.513 に答える
1

「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」を読む必要があります。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

コンピューターが完全な浮動小数点の結果を出すことは決してできないことを理解してください。

  • できるだけ少ない操作を実行します。つまり、丸め誤差が最も少なくなるように操作の順序を選択します。
  • 固定小数点演算 (または整数演算) は、すべてのアプリケーションで常に実用的であるとは限りませんが、一部のアプリケーションでは、これを回避できます。よく引き合いに出されるのは金融アプリケーションです (ペニーをなくすには 100 を掛けます! 終わったら 100 で割ります!)。
  • 今さら思いつかない技が他にもある。

私はあなたの操作にスピンを与える必要があります.私のマシンでeps2.2204e-16、あなたが得ているものよりも6桁低い. あなたのマシンにあるものepsを見てください-それは似ているはずです-それが似ている場合1e-12、私はあなたの結果がそれらの操作から期待するものとまったく同じだと思います.

これを乱数で行うと、

a = rand(6, 78);
b = rand(6, 6);
b = b + b';   % To make b symmetric
c = a' * b * a;
max(max(abs(c - c')))

ans =

   7.1054e-15

これは、多くの操作の後の丸め誤差で予想されるものに少し近いですが、入力、マシン、および他に何が影響しているのかわかりません。

乾杯、 -

于 2012-12-06T08:05:00.903 に答える