Я потратил часть вчера и сегодня разыскивание ошибки в некотором коде Matlab. Я думал, что моя проблема индексировала (со многими структурами, которые я не определил и все еще привыкаю к), но это оказалось водосливной ошибкой. Я пропустил это по очень определенной причине:
>> uint8(2) - uint8(1)
ans =
1
>> uint8(2) - uint8(2)
ans =
0
>> uint8(2) - uint8(3)
ans =
0
Я ожидал бы, что последний будет чем-то как -1
(или 255
). Посреди большого вектора, ошибочного 0
s было трудно обнаружить, но a 255
выделился бы легко.
Какие-либо подсказки относительно того, как обнаружить эти проблемы легко в будущем? (Идеально, я хотел бы выключить проверку переполнения, чтобы заставить его работать как C.) Изменяющийся на double
работы, конечно, но если я не понимаю, что это - a uint8
для начала это не помогает.
Вы можете начать с включения целочисленных предупреждений:
intwarning('on')
Это даст вам предупреждение при переполнении целочисленной арифметики.
Будьте осторожны, как указано здесь , это действительно замедляет целочисленную арифметику, поэтому используйте это только во время отладки.
См. функцию INTWARNING для управления предупреждениями о целочисленных операциях.
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html
Начиная с версии 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