Matlab 错误->;冒号操作数必须在数据类型的范围内。毫无意义
在下面的代码中,图像索引范围仅接受处理Matlab 错误->;冒号操作数必须在数据类型的范围内。毫无意义,matlab,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
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.
为什么会发生这种情况?要了解这个问题,首先要了解一些背景知识: 对于不同类型的数值,MATLAB具有相当独特的行为。最初,MATLAB只使用双精度浮点值(
double
)。在某种程度上,可以存储其他类型的数组,但不可能大量使用这些数组。直到Matalb7.0左右,使用非双精度运算才成为可能(我有点搞不清楚它到底是什么时候引入的)。如果你愿意的话,这些操作仍然有点“笨拙”
首先,MATLAB不允许混合类型的操作:
>> int8(4)+int16(6)
Error using +
Integers can only be combined with integers of the same class, or scalar doubles.
请注意错误消息:“标量加倍”。混合类型的一个例外是,如果其中一个操作数是标量双精度数,则任何操作都是可能的
另外需要注意的是,任何非双精度类型和双精度类型的操作都会导致非双精度类型的值:
>> int8(4)+6
ans =
int8
10
颜色操作符(:
)也不例外:
>> int8(4):6
ans =
1×3 int8 row vector
4 5 6
最后,要理解这个问题,最后要知道的是,end
是一个返回双标量值的函数(是的,它确实是一个函数,尽管它非常特殊,请参见帮助end
)
如果数组flt\u rot
为200x300,则第一个索引中的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.
问题的解决方案是,除了在内存使用量很重要的大型数据集中,不要对任何对象使用除double
以外的类型的数值。对于索引,使用整数不会比使用双倍更快,但会给您带来许多其他问题。默认值总是双倍是有原因的
这将有助于:
I2 = flt_rot(double(t2):end,:);
你的矩阵有多大?如果
end
是大于127的值,它将不适合int8
。我的矩阵是200X300,但索引值只有45。它应该足以存储索引。不是吗?