当然不是! ......或者是吗?我们来做一些测试 .
定义 x = [10 20 30 40 50]
. 然后,正如预期的那样,以下任何语句都会在 Matlab 中给出错误(下标索引必须是实数正整数或逻辑):
>> x(1.2)
>> x(-0.3)
>> x([1.4 2 3])
>> x([1.4 2.4 3.4])
>> x([1.4:4])
>> x(end/2)
但是, colon indices 中接受非整数值 . 以下所有工作都在最近的Matlab版本中,尽管有一个警告(当用作索引时,冒号操作符需要整数操作数) .
>> x(1.2:3)
ans =
10 20
>> x(0.4:3)
ans =
10 10 20
>> x(0.6:3)
ans =
10 20 30
>> x(1.2:0.7:5)
ans =
10 20 30 30 40 50
>> x(-0.4:3)
ans =
10 10 20 30
如果冒号表达式包含 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)
观察到的行为可以是 summarized ,如下所示:
-
当使用 colon index 时,有些 internal rounding 开始了 . 冒号索引是
a:b
或a:b:c
形式的表达式 . 当索引数组是标准数组时,例如[a b c]
甚至[a:b]
或[a:b:c]
,不会发生舍入 . -
对 nearest integer 进行舍入,但
-0.5
和0.5
之间的数字为 special-cased :它们舍入为1
而不是0
. 当然,如果舍入产生的整数为负,则会发生错误 .
在 Octave 的最新版本中可以看到类似的行为,除了:
- 显然,正常舍入到最接近的整数,而不处理
-0.5
和_534650之间的数字作为特例;所以这些给出了一个错误:
>> x(0.4:3)
>> x(-0.4:3)
- 当非整数范围包含单个值时发出错误:
x(2.4:4)
有效,但x(3.4:4)
不起作用(当然,x([2.4 3.4])
和x(3.4)
也不起作用) .
除此之外,结果与Matlab中的结果相同,并且还发出警告(非整数范围用作索引) .
警告和Octave与Matlab类似的事实表明这是 intended 行为 . 某处是 documented 吗?任何人都可以给出 more infromation 或对此有所了解吗?
1 回答
其他意见:
x(1.2:3)
理论上应解释为:subsref(x, substruct('()',1.2:3))
. 但是,如问题中所述,“当索引数组是标准数组时,不会发生舍入”,这会导致显式的下标引用失败 . 这表明发生了类似于logical short-circuiting或者可能是multithreaded partitioning(其中中间变量是"not really created")的机制 .已发出警告的标识符为
MATLAB:colon:nonIntegerIndex
.理论:
官方评论: