2

armadilloこんにちは、線形代数と行列のライブラリを使用して、スクリプトを MATLAB から C++ に書き直しています。

多かれ少なかれ同じ出力を得るために、私はcoutメソッドを呼び出しました:

cout.precision(4);
cout.setf(ios::fixed);

しかし、私は別の結果を得ています:

マトラブの結果:

0.0000    0.0000    0.0000    0.0000    0.0000   
0.0012    0.0014    0.0016    0.0020    0.0281  
0.0396    0.0297    0.0297    0.0495    0.0976  

アルマジロ c++ の結果:

0.0000    0.0000    0.0000    0.0000    0.0000 
0.0012    0.0014    0.0016    0.0020    0.0282 
0.0416    0.0312    0.0312    0.0520    0.1027

0.039現在、これらの小さな不正確さ (に近い0.041) が、変換された C++ コードのエラーによって引き起こされているのか、g++ と MATLAB の倍精度の通常の違いと見なされるべきなのかはわかりません。

私のコードでは、次のような多くのサイクルを使用しています。

xi_summed = xi_summed + normalise((trans % (alpha.col(t) * b.t())));

ここxi_summedで、transalpha、およびbは要素ごとの乗算であり、は転置および正規化は、行列配列の合計を にする関数です。arma::mat%mat::t()A1

4

2 に答える 2

3

これは確かに通常の違いではありません。

マシンのイプシロンは、取得しているエラーよりも桁違いに小さくなります (つまり、2.22e-016 対 2.0e-3)。

次の C++ コードを使用して、マシンのイプシロンを確認できます。

#include <limits>

cout << "Machine Epsilon is: " << numeric_limits<double>::epsilon() << endl;

Matlab スクリプトは同じ制限に拘束されます。これを確認するには、Matlab コマンド ウィンドウに次のように入力します。

eps

Matlab と C++ で実行している計算が数学的に同等である場合、特に 4 dp の精度で同じ結果が得られるはずです!

于 2012-02-16T13:28:45.763 に答える
2

通常、精度ははるかに優れています。次のように入力すると、matlab の精度を確認できますeps。私にとっては2.2204e-16.

ただし、実行している微積分にも大きく依存します。

たとえば、2 つの非常に大きな数の差を計算し、その差が非常に小さい場合、精度は非常に悪くなります。

確かにeps、相対的な精度です。したがって、 と入力eps(n)すると、指定された値の精度が得られます。

たとえば、eps(10^16)です2。したがって、 と同じくらい大きい数値の操作の10^16場合、精度は になります2

于 2012-02-16T13:01:08.847 に答える