我昨天花了一些时间,今天跟踪了一些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
开始,这没有用。
答案 0 :(得分:13)
答案 1 :(得分:6)
从版本R2010b及更高版本开始,函数INTWARNING has been removed以及these warning messages for integer math and conversion:
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
答案 2 :(得分:1)
请参阅INTWARNING函数以控制整数运算的警告。
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/intwarning.html