У меня возникают проблемы, когда я сравниваю результаты с разными прогонами моего программного обеспечения Matlab с тем же входом. Для того, чтобы локализовать проблему, я сделал следующее:Численные проблемы в Matlab: тот же ввод, тот же код -> другой выход?
- сохранить все соответствующие переменные, используя метод от Matlab Save()
- вызова метода, который вычисляет что-то
- сохранить все соответствующие выходные переменными снова с помощью Сохранить()
без изменения называемого метода, я сделал еще один проход с
- нагрузки переменные сохраняются Abov e и сравните с текущими входными переменными с использованием isequal()
- снова вызовите мой метод с текущими входными переменными
- загрузите внешние переменные, сохраненные выше, и сравните их.
Не могу поверить, что сравнение в последней «линии» обнаруживает небольшие различия. Вычисления включают числа с одной и двойной точностью, ошибка в величине 1е-10 (выход - это двойное число).
Единственное возможное объяснение, которое я мог представить, заключается в том, что либо Matlab теряет определенную точность при сохранении переменных (что я считаю очень маловероятным, я использую бинарный формат Matlab по умолчанию) или что есть вычисления, включенные как a = b + c + d, который можно вычислить как a = (b + c) + d или a = b + (c + d), что может привести к численным различиям.
Вы знаете, что может быть причиной описанных выше наблюдений?
Большое спасибо!
Не могли бы вы предоставить минимальный пример для этого? Он может сильно зависеть от того, какие функции вы используете. Различия распространены, если какая-либо функция в пути использует некоторую случайность. Вероятно, это не так, но воспроизводимый пример все равно даст другим возможность работать. –
К сожалению, метод, который я вызываю, включает много шагов вычисления и даже некоторый код, который я не могу предоставить. Мне просто интересно, является ли это поведение «действительным действием Matlab» или если оно указывает на проблему в моем коде. Есть некоторые вызовы randn(), но RandStream устанавливается перед каждым прогоном, поэтому он дает такое же значение. И похоже, что после устранения одиночных чисел точности из кода устраняет возникновение проблемы (или делает ее менее вероятной?) – Philipp
Это очень неожиданное поведение от MATLAB.Возможно ли, что разница возникает, когда вы сохраняете переменные? Вы говорите, что загружаете переменные и сравниваете - как насчет сохранения результатов обоих прогонов и сравнения этих сохраненных результатов? –