这段MATLAB代码(包含冒号运算符)是如何解析的?

cczfrluj  于 2023-01-21  发布在  Matlab
关注(0)|答案(1)|浏览(148)

最近,我想计算几个值的下一个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)

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

unguejic

unguejic1#

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) + 57:(11 - mod(7:11, 5) + 5)相同,如上面使用运算符优先级所示。
现在进入第二部分:为什么你得到8个值,而不是5个?2这里的问题是“用数组生成数组”。3基本上:

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会由于数组大小不兼容而导致错误。

相关问题