这个MATLAB代码(涉及冒号运算符)是如何解析的



最近,我想计算几个值的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运算符优先级的列表

如您所见,括号()首先求解,这意味着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个?这里的问题是";用阵列形成阵列";。基本上:

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

这显示了发生了什么。如果用冒号初始化数组,但端点为数组,MATLAB只使用第一个值。尽管听起来很奇怪,但这是有案可查的行为。

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

相关内容

  • 没有找到相关文章

最新更新