точность Matlab и C ++ - PullRequest
       26

точность Matlab и C ++

2 голосов
/ 16 февраля 2012

Привет, я переписываю скрипт из MATLAB в C ++, используя библиотеку armadillo для линейной алгебры и матрицы.

для получения более или менее того же результата, который я назвал методом cout:

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

но я получаю другой результат:

Результат Matlab:

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  

Armadillo 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, trans, alpha, b равны arma::mat, а % - поэлементное умножение и mat::t() транспонировать и нормализовать функцию, которая делает записи матрицы A сумма массива 1.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Это, конечно, не нормальная разница!

Эпсилон машины будет на порядок меньше ошибок, которые вы получаете (т. Е. 2,22e-016 против 2,0e-3).

Вы можете подтвердить свой компьютер epsilon с помощью следующего кода C ++:

#include <limits>

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

Ваш скрипт Matlab будет связан с теми же ограничениями;Вы можете подтвердить это, введя следующее в командном окне Matlab:

eps

Если вычисления, которые вы выполняете в Matlab и C ++, математически эквивалентны, то вы должны получить тот же результат - , особенно с 4 dpточность!

2 голосов
/ 16 февраля 2012

Обычно точность намного выше, вы можете узнать точность matlab, набрав eps. Для меня это 2.2204e-16.

Однако, это также сильно зависит от того, какое исчисление вы делаете.

Например, если вы вычислите разницу двух очень больших чисел, а разница очень мала, ваша точность будет очень плохой.

Действительно, eps - относительная точность. Поэтому, если вы введете eps(n), у вас будет точность для заданного значения.

Например, eps(10^16) - это 2. Так что для операций с такими большими числами, как 10^16, точность будет 2.

...