【发布时间】:2016-11-06 22:31:46
【问题描述】:
当然不是! ...或者是吗?让我们做一些测试。
定义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中相同,同时也发出警告(Non-integer range used as index)。
警告以及 Octave 与 Matlab 的工作方式相似的事实表明这是有意行为。它是否在某处记录?谁能提供更多信息或对此有所了解?
【问题讨论】:
标签: arrays matlab octave matrix-indexing