• ベストアンサー

MATLABでの行列の全要素の和

MATLABでの行列の全要素の和を計算するのに下の例のようにfor文を使うのとsum関数を使うのとで結果が違います。何故ですか? 計算結果の差をとってみると極々微小な差が生じてしまいます(e-10位)。 シミュレーションの中でこのような処理を行っているのでより正確な方が知りたいです。 例 A=rand(10); plus=0; sum=0; for i=1:10  for j=1:10   plus=plus+A(i,j);  end end sum=sum(A(:));

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

コンピュータの浮動小数点演算は、計算順番が違うだけで差が出るものです。 http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0#.E3.82.A8.E3.83.A9.E3.83.BC.EF.BC.88.E8.AA.A4.E5.B7.AE.EF.BC.89 MATLABのsumがどんな実装しているのかは、知りません。 ですが、このforで集計している部分は、まったく無策なのは明らかです。 今回のAは、全て正の値なので、小さい値から順番に足していくと、誤差が小さくなります。 なので、単純な足し算、ソートしての足し算、sumの3つを比べてどうなっているか、である程度の判断はできます。 ですが、正負が混じったりすると、単純ではありません。 これ以上の精度が必要なら、多倍長精度と呼ばれるようなものを使う必要があります。 MATLAB標準には無いので、外部ツールに頼ることになります。

_unknown_
質問者

お礼

ソートして足し算してみた結果と比べるとどっちも同じくらいの精度だけど微小な差が生じることがわかりました。 ありがとうございました。