错误 - >冒号操作数必须在数据类型的范围内。没意义

时间:2018-01-29 01:54:02

标签: matlab

在下面的代码中,图像索引范围只接受处理int16但是我无法找到适合这种情况的解释。在相同的代码中,您可以注意到我是否将数据类型更改为int8,以便显示相同的值错误。

K>> t2 = int8(t)

t2 =

  int8

   45

K>> I2 = flt_rot(t:end,:);
K>> I2 = flt_rot(t2:end,:);
Error using  : 
Colon operands must be in the range of the data type.

为什么会这样?

1 个答案:

答案 0 :(得分:2)

要理解这个问题,首先要做一点背景:

对于不同类型的数值,MATLAB具有相当独特的行为。最初,MATLAB仅使用双精度浮点值(double)。在某些时候,它可以存储其他类型的数组,但是不可能使用它们。直到MATALB 7.0左右,才能进行非双打算术(当引入时,我有点朦胧)。如果你愿意的话,这些操作仍然有点“尴尬”。

首先,MATLAB不允许使用混合类型进行操作:

>> int8(4)+int16(6)
Error using  + 
Integers can only be combined with integers of the same class, or scalar doubles.

请注意错误消息:"标量加倍"。混合类型的一个例外是,如果其中一个操作数是标量double,则任何操作都是可能的。

另外需要注意的是,任何具有非double类型和double类型的操作都会产生非double类型的值:

>> int8(4)+6
ans =
  int8
   10

颜色运算符(:)也不例外:

>> int8(4):6
ans =
  1×3 int8 row vector
   4   5   6

最后,了解这个问题的最后一件事是end是一个返回双标量值的函数(是的,它确实是一个函数,尽管是一个非常特殊的函数,请参阅{{1} })。

如果数组help end为200x300,则第一个索引中的flt_rot返回200.即endflt_rot(t2:end,:)相同。由于flt_rot(t2:200,:)t2类型:

int8

问题的解决方案是不要使用除>> t2=int8(45); >> t2:200 Error using : Colon operands must be in the range of the data type. 以外的其他类型的数值,除非在大数据集中使用的内存量很重要。对于索引,使用整数不会比使用双精度更快,但会给你带来很多其他问题。有一个原因是默认值总是加倍。

这将有效:

double