最近,我想计算几个值的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) + 5
与7:(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:11
和mod(7:11,5)
。然后,它从元素上减去这两个数组,并在每个元素上加5。值得注意的是,7:12 - mod(7:11, 5) + 5
可以工作,而(7:12) - mod(7:11, 5) + 5
会由于不兼容的数组大小而导致错误。