2010-08-31 5 views
4

У меня возникают проблемы, когда я сравниваю результаты с разными прогонами моего программного обеспечения Matlab с тем же входом. Для того, чтобы локализовать проблему, я сделал следующее:Численные проблемы в Matlab: тот же ввод, тот же код -> другой выход?

  • сохранить все соответствующие переменные, используя метод от Matlab Save()
  • вызова метода, который вычисляет что-то
  • сохранить все соответствующие выходные переменными снова с помощью Сохранить()

без изменения называемого метода, я сделал еще один проход с

  • нагрузки переменные сохраняются Abov e и сравните с текущими входными переменными с использованием isequal()
  • снова вызовите мой метод с текущими входными переменными
  • загрузите внешние переменные, сохраненные выше, и сравните их.

Не могу поверить, что сравнение в последней «линии» обнаруживает небольшие различия. Вычисления включают числа с одной и двойной точностью, ошибка в величине 1е-10 (выход - это двойное число).

Единственное возможное объяснение, которое я мог представить, заключается в том, что либо Matlab теряет определенную точность при сохранении переменных (что я считаю очень маловероятным, я использую бинарный формат Matlab по умолчанию) или что есть вычисления, включенные как a = b + c + d, который можно вычислить как a = (b + c) + d или a = b + (c + d), что может привести к численным различиям.

Вы знаете, что может быть причиной описанных выше наблюдений?

Большое спасибо!

+0

Не могли бы вы предоставить минимальный пример для этого? Он может сильно зависеть от того, какие функции вы используете. Различия распространены, если какая-либо функция в пути использует некоторую случайность. Вероятно, это не так, но воспроизводимый пример все равно даст другим возможность работать. –

+0

К сожалению, метод, который я вызываю, включает много шагов вычисления и даже некоторый код, который я не могу предоставить. Мне просто интересно, является ли это поведение «действительным действием Matlab» или если оно указывает на проблему в моем коде. Есть некоторые вызовы randn(), но RandStream устанавливается перед каждым прогоном, поэтому он дает такое же значение. И похоже, что после устранения одиночных чисел точности из кода устраняет возникновение проблемы (или делает ее менее вероятной?) – Philipp

+2

Это очень неожиданное поведение от MATLAB.Возможно ли, что разница возникает, когда вы сохраняете переменные? Вы говорите, что загружаете переменные и сравниваете - как насчет сохранения результатов обоих прогонов и сравнения этих сохраненных результатов? –

ответ

1

это действительно, кажется, вызвано одной/двойной смесью в расчетах. Поскольку я переключился только на двойную точность, проблема больше не возникала. Спасибо всем за ваши мысли.

0

Это могут быть ошибки округления. вы можете найти точность вычислений с плавающей точкой в ​​вашей системе, как так:

>> eps('single') 

ans = 

    1.1921e-07 

В моей системе это сообщает 10^-7, которая может объяснить расхождения Вашего заказа

+2

, но не должны округлять всегда возвращать то же значение? Или это зависит от «недетерминированных» факторов? – Philipp

0

Для обеспечения воспроизводимых результатов, особенно если вы используете любые случайные производящие функции (прямо или косвенно), вы должны восстановить то же состояние в начале каждого прогона:

%# save state (do this once) 
defaultStream = RandStream.getDefaultStream; 
savedState = defaultStream.State; 
save rndStream.mat savedState 

%# load state (do this at before each run) 
load rndStream.mat savedState 
defaultStream = RandStream.getDefaultStream(); 
defaultStream.State = savedState; 
+0

Я делаю stream0 = RandStream ('mrg32k3a', 'Seed', myConstantSeed); RandStream.setDefaultStream (stream0); перед каждым прогоном. Это тоже должно работать, не так ли? – Philipp

+0

Да, это одно и то же, только с использованием семени для инициализации состояния. – Amro

+0

Единственное, что я могу придумать, - попытаться сравнить результаты двух сохраненных прогонов (в случае сохранения/загрузки вводят некоторую потерю точности), как предлагает @AlexFeinman в комментариях выше .. – Amro

Смежные вопросы