当然没有!......是吗?我们来做些测试。
定义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)
然而,冒号索引中接受非整数值。所有以下工作在最近的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)
观察到的行为可总结如下:
- 当使用冒号索引时,会出现一些内部舍入。冒号索引是
a:b
或a:b:c
形式的表达式。当索引数组是标准数组(如[a b c]
甚至[a:b]
或[a:b:c]
)时,不会发生舍入。 - 舍入到最接近的整数,除了
-0.5
和0.5
之间的数字是特殊大小写:它们被四舍五入到1
而不是0
。当然,如果从四舍五入得到的整数是负的,则发生错误。
类似的行为在最近版本的Octave中也有,除了:
- 显然,正常四舍五入到最接近的整数被完成,而不将
-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)
也不能工作)。
除此之外,结果与Matlab中的结果相同,并发出警告(* 非整数范围用作索引 *)。
警告和Octave与Matlab类似的工作方式表明这是故意的行为。它是否在某个地方记录?任何人都可以给予更多信息或对此进行说明?
1条答案
按热度按时间vql8enpb1#
其他观察:
x(1.2:3)
理论上应解释为:subsref(x, substruct('()',1.2:3))
。然而,正如问题中提到的,“* 当索引数组是标准数组时,不会发生舍入 *”,这会导致显式下标引用失败。这表明发生了类似于logical short-circuiting或multithreaded partitioning的机制(其中中间变量“没有真正创建”)。MATLAB:colon:nonIntegerIndex
。理论:
官方评论: