Как распознать водосливные ошибки в Matlab?

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

>> uint8(2) - uint8(1)

ans =

    1

>> uint8(2) - uint8(2)

ans =

    0

>> uint8(2) - uint8(3)

ans =

    0

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

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

17
задан Benjamin Oakes 2 March 2010 в 19:52
поделиться

3 ответа

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

intwarning('on')

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

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

13
ответ дан 30 November 2019 в 13:45
поделиться

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

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

1
ответ дан 30 November 2019 в 13:45
поделиться

Начиная с версии 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
6
ответ дан 30 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: