質問: 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(:));
回答: コンピュータの浮動小数点演算は、計算順番が違うだけで差が出るものです。 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標準には無いので、外部ツールに頼ることになります。