Подтвердить что ты не робот

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

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

>> uint8(2) - uint8(1)

ans =

    1

>> uint8(2) - uint8(2)

ans =

    0

>> uint8(2) - uint8(3)

ans =

    0

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

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

4b9b3361

Ответ 1

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

intwarning('on')

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

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

Ответ 2

Начиная с выпуска 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