在下面的代码中,图像索引范围只接受处理,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.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
要理解这个问题,首先要了解一下背景:
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.
Run Code Online (Sandbox Code Playgroud)
请注意错误消息:“scalar doubles”。混合类型的一个例外是,如果操作数之一是双精度标量,则任何操作都是可能的。
另一件需要注意的事情是,任何具有非双精度类型和双精度类型的操作都会产生非双精度类型的值:
>> int8(4)+6
ans =
int8
10
Run Code Online (Sandbox Code Playgroud)
颜色运算符 ( :) 也不例外:
>> int8(4):6
ans =
1×3 int8 row vector
4 5 6
Run Code Online (Sandbox Code Playgroud)
最后,要理解这个问题,最后一件事end是返回一个双标量值的函数(是的,它确实是一个函数,尽管它是一个非常特殊的函数,请参阅 参考资料help end)。
如果您有一个flt_rot200x300的数组,则end在第一个索引中返回 200。也就是说,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.
Run Code Online (Sandbox Code Playgroud)
您的问题的解决方案是不使用double任何类型的数值,除非在使用的内存量很重要的大型数据集中。对于索引,使用整数不会比使用双精度有任何加速,但会给您带来许多其他问题。默认值总是双打是有原因的。
这将起作用:
I2 = flt_rot(double(t2):end,:);
Run Code Online (Sandbox Code Playgroud)