我花了一些时间昨天和今天跟踪一些Matlab代码中的错误.我原以为我的问题是索引(有许多我没有定义的结构,我仍然习惯),但结果却是一个溢出错误.我错过了这个非常具体的原因:
>> uint8(2) - uint8(1)
ans =
1
>> uint8(2) - uint8(2)
ans =
0
>> uint8(2) - uint8(3)
ans =
0
Run Code Online (Sandbox Code Playgroud)
我原以为最后一个会像-1(或255).在一个大矢量的中间,错误的0s很难被发现,但是255很容易突出.
有关如何在将来轻松检测这些问题的任何提示?(理想情况下,我想关闭溢出检查以使其像C一样工作.)double当然,改变工作,但如果我没有意识到它是一个uint8开始,这没有帮助.
dbr*_*ien 13
您可以从启用整数警告开始:
intwarning('on')
Run Code Online (Sandbox Code Playgroud)
当整数运算溢出时,这将给出警告.
要小心的是,作为概括这里,这确实减慢整数运算所以只能调试期间使用此.
从版本R2010b及更高版本开始,已删除函数INTWARNING,以及用于整数数学和转换的这些警告消息:
MATLAB:intConvertNaNMATLAB:intConvertNonIntValMATLAB:intConvertOverflowMATLAB:intMathOverflow因此,使用INTWARNING不再是确定何时发生整数溢出的可行选项.另一种方法是使用CLASS函数测试数据类,并在执行操作之前相应地重新编程.这是一个例子:
if strcmp(class(data),'uint8') %# Check if data is a uint8
data = double(data); %# Convert data to a double
end
Run Code Online (Sandbox Code Playgroud)
您也可以使用ISA功能:
if ~isa(data,'single') %# Check if data is not a single
data = single(data); %# Convert data to a single
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |