Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 错误->;冒号操作数必须在数据类型的范围内。毫无意义_Matlab - Fatal编程技术网

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。它应该足以存储索引。不是吗?