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

时间:2010-03-02 19:52:20

标签: matlab

我昨天花了一些时间,今天跟踪了一些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开始,这没有用。

3 个答案:

答案 0 :(得分:13)

您可以从启用整数警告开始:

intwarning('on')

当整数算术溢出时,这将给出警告。

但要注意,如here所述,这会减慢整数运算速度,因此只能在调试期间使用它。

答案 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