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)
    也不工作)

除此之外,结果与Matlab中的结果相同,并发出警告(非整数范围用作索引)

警告和Octave与Matlab工作原理类似的事实表明,这是预期的行为。它在什么地方被记录下来了吗?有人能提供更多信息吗?
或阐明这一点吗?

其他观察结果:
  • x(1.2:3)
    理论上应解释为:
    subsref(x,substruct(“()”,1.2:3))
    。但是,如问题中所述,“当索引数组是标准数组时,不会发生舍入”,这会导致显式下标引用失败。这表明发生了一种类似于或(中间变量“未真正创建”)的机制

  • 发出的警告的标识符是
    MATLAB:colon:nonIntegerIndex

理论:
  • 可能存在下标引用的重载版本,其中存在检测下标本身是否为整数的初始步骤。如果不是,MATLAB会将其“重定向”到其他一些类家族()
官方评论:
  • 这就是我们在这个问题上要说的: 。。。在最初的日子里,MATLAB实现者倾向于在输入验证方面尽可能地宽容。随着时间的推移,我们意识到这种理念对用户来说并不总是最好的,于是我们开始将一些语言规则变得更加严格和规范。一个例子是引入了关于无效索引(非整数、非正等)的错误消息。然而,我们不能总是像我们喜欢的那样收紧行为。有时这是因为我们发现太多的用户代码利用了原始行为。这就是为什么你会在某些地方继续看到这种行为变化的原因之一。。。我建议用户只使用整数值索引。用户可以显式调用round或floor或其他任何函数,将冒号运算符的输出转换为整数值


您使用的是什么版本的matlab/octave?对于R2009a,它不起作用。。。还有人可以检查其他版本吗?我的R2014b就像@Luis描述的八度音阶行为一样。它只接受
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)