Arrays Matlab是否接受非整数索引?
当然不是。。。还是这样?让我们做一些测试 定义Arrays Matlab是否接受非整数索引?,arrays,matlab,octave,matrix-indexing,Arrays,Matlab,Octave,Matrix Indexing,当然不是。。。还是这样?让我们做一些测试 定义x=[102030050]。然后,如预期的那样,以下任何语句在Matlab中给出错误(下标索引必须是实正整数或逻辑): 但是,冒号索引中接受非整数值。以下所有操作都在最新的Matlab版本中进行,但有一个警告(冒号运算符用作索引时需要整数操作数) 如果冒号表达式包含end,它也可以工作: >> x(1.5:end-2) ans = 20 30 >> x(1.5:end/6:end-1) ans = 20
x=[102030050]
。然后,如预期的那样,以下任何语句在Matlab中给出错误(下标索引必须是实正整数或逻辑):
但是,冒号索引中接受非整数值。以下所有操作都在最新的Matlab版本中进行,但有一个警告(冒号运算符用作索引时需要整数操作数)
如果冒号表达式包含end
,它也可以工作:
>> x(1.5:end-2)
ans =
20 30
>> x(1.5:end/6:end-1)
ans =
20 20 30 40
另一方面,以下各项不起作用,并给出与上述相同的错误:
>> x(-0.6:2)
>> x(-0.5:2)
观察到的行为可归纳如下:
- 当使用冒号索引时,一些内部舍入将生效。冒号索引是
或A:b
形式的表达式。当索引数组是标准数组时,例如A:b:c
或甚至[ab c]
或[a:b]
时,不会发生舍入[a:b:c]
- 除了
和-0.5
之间的数字是特殊情况下的:它们被四舍五入到0.5
,而不是1
。当然,如果舍入产生的整数为负,则会发生错误0
- 显然,正常四舍五入到最接近的整数,没有将
和-0.5
之间的数字作为特例处理;所以这些给出了一个错误:0.5
>> x(0.4:3) >> x(-0.4:3)
- 当非整数范围包含单个值时会发出错误:
工作,但x(2.4:4)
不工作(当然,x(3.4:4)
和x([2.4 3.4])
也不工作)x(3.4)
理论上应解释为:x(1.2:3)
。但是,如问题中所述,“当索引数组是标准数组时,不会发生舍入”,这会导致显式下标引用失败。这表明发生了一种类似于或(中间变量“未真正创建”)的机制subsref(x,substruct(“()”,1.2:3))
- 发出的警告的标识符是
MATLAB:colon:nonIntegerIndex
- 可能存在下标引用的重载版本,其中存在检测下标本身是否为整数的初始步骤。如果不是,MATLAB会将其“重定向”到其他一些类家族()
- 这就是我们在这个问题上要说的: 。。。在最初的日子里,MATLAB实现者倾向于在输入验证方面尽可能地宽容。随着时间的推移,我们意识到这种理念对用户来说并不总是最好的,于是我们开始将一些语言规则变得更加严格和规范。一个例子是引入了关于无效索引(非整数、非正等)的错误消息。然而,我们不能总是像我们喜欢的那样收紧行为。有时这是因为我们发现太多的用户代码利用了原始行为。这就是为什么你会在某些地方继续看到这种行为变化的原因之一。。。我建议用户只使用整数值索引。用户可以显式调用round或floor或其他任何函数,将冒号运算符的输出转换为整数值
x(0.4:3)
和x(-0.4:3)
@Shai,这很有趣。我编辑了我的问题,提到它只发生在最近的版本中。看到更多的测试等待。。。什么?@LuisMendo关于八度音阶的问题,请看
>> x(-0.6:2)
>> x(-0.5:2)
>> x(0.4:3)
>> x(-0.4:3)