如何识别Matlab中的溢出错误?

Ben*_*kes 17 matlab

我花了一些时间昨天和今天跟踪一些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)

当整数运算溢出时,这将给出警告.

要小心的是,作为概括这里,这确实减慢整数运算所以只能调试期间使用此.

  • 注意:[INTWARNING现已删除](http://www.mathworks.com/help/techdoc/rn/bsdgysw-1.html#bseu09o-1),上面的链接现在无效. (4认同)

gno*_*ice 6

从版本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
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)

  • 如果您不知道数据的来源,那么您一定要非常仔细地进行输入测试. (2认同)