Как распознать ошибки переполнения в Matlab? - PullRequest
17 голосов
/ 02 марта 2010

Я провел часть вчера и сегодня, выслеживая ошибку в некотором коде Matlab. Я думал, что моей проблемой является индексирование (со многими структурами, которые я не определил и до сих пор привыкаю), но это оказалось ошибкой переполнения. Я пропустил это по очень конкретной причине:

>> uint8(2) - uint8(1)

ans =

    1

>> uint8(2) - uint8(2)

ans =

    0

>> uint8(2) - uint8(3)

ans =

    0

Я бы ожидал, что последний будет что-то вроде -1 (или 255). В середине большого вектора ошибочные 0 были трудно обнаружить, но 255 легко выделялся бы.

Какие-нибудь советы о том, как легко обнаружить эти проблемы в будущем? (В идеале, я хотел бы отключить проверку переполнения, чтобы она работала как C.) Изменение на double работает, конечно, но если я не понимаю, что для начала это uint8, это не ' t help.

Ответы [ 3 ]

13 голосов
/ 02 марта 2010

Вы можете начать с включения целочисленных предупреждений:

intwarning('on')

Это выдаст предупреждение при переполнении целочисленной арифметики.

Осторожно, хотя, как указано здесь , это замедляет целочисленную арифметику, поэтому используйте ее только во время отладки.

6 голосов
/ 02 марта 2010

Начиная с версии R2010b и более поздних, функция INTWARNING была удалена вместе с этими предупреждениями для целочисленной математики и преобразования :

  • MATLAB:intConvertNaN
  • MATLAB:intConvertNonIntVal
  • MATLAB:intConvertOverflow
  • MATLAB:intMathOverflow

Таким образом, использование INTWARNING больше не является жизнеспособным вариантом для определения, когда происходят целочисленные переполнения. Альтернативой является использование функции CLASS для проверки класса ваших данных и соответствующей перезаписи перед выполнением операции. Вот пример:

if strcmp(class(data),'uint8')  %# Check if data is a uint8
  data = double(data);          %# Convert data to a double
end

Вы также можете использовать функцию ISA :

if ~isa(data,'single')  %# Check if data is not a single
  data = single(data);  %# Convert data to a single
end
1 голос
/ 02 марта 2010

См. Функцию INTWARNING для управления предупреждениями о целочисленных операциях.

http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...