首页 文章

Matlab是否接受非整数索引?

提问于
浏览
29

当然不是! ......或者是吗?我们来做一些测试 .

定义 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:ba:b:c 形式的表达式 . 当索引数组是标准数组时,例如 [a b c] 甚至 [a:b][a:b:c] ,不会发生舍入 .

  • nearest integer 进行舍入,但 -0.50.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 回答

  • 4

    其他意见:

    • x(1.2:3) 理论上应解释为: subsref(x, substruct('()',1.2:3)) . 但是,如问题中所述,“当索引数组是标准数组时,不会发生舍入”,这会导致显式的下标引用失败 . 这表明发生了类似于logical short-circuiting或者可能是multithreaded partitioning(其中中间变量是"not really created")的机制 .

    • 已发出警告的标识符为 MATLAB:colon:nonIntegerIndex .

    理论:

    • 也许存在下载版本的下标引用,其中有一个初始步骤,即检测下标本身是否为整数 . 如果他们不是,MATLAB "redirects"这对其他一些类(example) .

    官方评论:

    ......在早期,MATLAB实施者倾向于在输入验证方面尽可能宽松 . 随着时间的推移,我们意识到这种理念并不总是最适合用户的理念,我们开始使一些语言规则更加严格和规范 . 一个例子是引入有关无效索引的错误消息(非整数,非积极等) . 但是,我们不能总是像我们喜欢的那样收紧行为 . 有时这是因为我们发现过多的用户代码正在利用原始行为 . 这是你在某些地方继续看到这种行为变化的原因之一 . ...我建议用户只使用整数值索引 . 用户可以显式调用round或floor或其他任何内容来将冒号运算符的输出转换为整数值 .

相关问题