最近,我想计算几个值的下一个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)
这已经暗示了对观察结果的解释,但我仍然对整个解释感到好奇。
1条答案
按热度按时间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) + 5
与7:(11 - mod(7:11, 5) + 5)
相同,如上面使用运算符优先级所示。现在进入第二部分:为什么你得到8个值,而不是5个?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:11
和mod(7:11,5)
。然后,它将两个数组元素相减,并将每个元素加5。这里值得注意的是,7:12 - mod(7:11, 5) + 5
可以正常工作,而(7:12) - mod(7:11, 5) + 5
会由于数组大小不兼容而导致错误。