【问题标题】:How is this MATLAB code (involving colon operator) resolved?这个 MATLAB 代码(涉及冒号运算符)是如何解决的?
【发布时间】:2020-10-28 10:21:09
【问题描述】:

最近,我想计算几个值的下一个 5 的倍数。 我对这段代码的输出感到非常困惑,应该做到了:

7:11 - mod(7:11, 5) + 5
ans =
    7     8     9    10    11    12    13    14

虽然实际可行的解决方案是这样的:

(7:11) - mod(7:11, 5) + 5
ans =

    10    10    10    15    15

所以这似乎与运算符优先级有关!但是第一个命令究竟是做什么的,为什么它会输出一个(1,8) 向量?


附录:我发现第一个命令也可以写成:

7:(11 - mod(7:11, 5) + 5)

这已经暗示了观察结果的解释,但我仍然对整个解释感到好奇。

【问题讨论】:

    标签: matlab operator-precedence colon


    【解决方案1】:

    Here's the list of MATLAB operator precedence

    如您所见,括号 () 首先被求解,这意味着 mod(7:11,5) 将首先被求解。然后点6),从左到右进行加减运算,即11-mod(7:11,5)然后11-mod(7:11,5)+5。然后点 7),冒号 : 被评估,因此 7:11-mod(7:11,5)+5

    正如您正确指出的那样,7:11 - mod(7:11, 5) + 5 7:(11 - mod(7:11, 5) + 5) 相同,如上所示,使用运算符优先级。


    现在到第二部分:为什么你得到 8 个值,而不是 5 个?这里的问题是“用数组制作数组”。基本上:

    1:3
    ans =
         1     2     3
    1:(3:5)
    ans =
         1     2     3
    

    这显示了正在发生的事情。如果您使用冒号初始化数组,但端点为 array,则 MATLAB 仅使用第一个值。听起来很奇怪,它是documented behaviour

    mod(7:11,5) 生成一个数组[2 3 4 0 1]。然后从11 中减去该数组,并添加5 [14 13 12 16 15]。现在,正如我们在文档中看到的那样,只考虑第一个元素。 7:[14 13 12 16 15] 被解析为 7:14 并将产生 8 个值,如您所示。

    执行(7:11) - mod(7:11, 5) + 5 首先会创建两个数组:7:11mod(7:11,5)。然后它按元素减去两个数组,并将每个元素加 5。有趣的是,7:12 - mod(7:11, 5) + 5 可以工作,而(7:12) - mod(7:11, 5) + 5 会由于数组大小不兼容而导致错误。

    【讨论】:

    • 哇,非常彻底的答案!我仍然想知道7:11 - mod(7:11, 5) + 5 是否应该抛出一个错误,或者至少是一个警告!? MATLAB 只使用第一个值对我来说似乎不是很直观,并且可能会导致脚本中出现一些难以发现的错误。
    • @rotton 可能有一些理由将1:(3:5) 作为有效语法,其余的都是标准运算符优先级。所以我不认为应该抛出警告,因为人们可能真的想要这个(它是有效的语法,警告通常是为病态矩阵、达到的最大迭代次数等保留的)。
    • @rotton Luis Mendo sent me a doc link 记录了使用冒号和数组作为输入创建的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多