在下面的代码中,图像索引范围只接受处理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.
为什么会这样?
答案 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.即end
与flt_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