这个MATLAB代码(涉及冒号操作符)是如何解析的?
最近,我想计算几个值中5的下一个倍数。 我被这段代码的输出弄糊涂了,它本应该做到这一点:这个MATLAB代码(涉及冒号操作符)是如何解析的?,matlab,operator-precedence,colon,Matlab,Operator Precedence,Colon,最近,我想计算几个值中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
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)
这已经暗示了对观察结果的解释,但我仍然对整个解释感到好奇。
如您所见,括号(()
)首先被解算,这意味着mod(7:11,5)
将首先被解算。然后第6点),从左到右进行加减,即11模(7:11,5)
然后11模(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:[141312615]
被解析为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
会由于数组大小不兼容而导致错误。哇,答案非常彻底!我仍然想知道7:11-mod(7:11,5)+5
是否应该抛出一个错误,或者至少是一个警告!?MATLAB仅使用第一个值对我来说不是很直观,可能会导致脚本中出现一些难以发现的错误。@rotton可能有一些理由将1:(3:5)
作为有效语法,其余的都是标准运算符优先级。所以我认为不应该抛出警告,因为人们可能真的想要这样做(这是有效的语法,警告通常是为病态矩阵、达到的最大迭代次数等内容保留的)。@rotton记录了使用冒号和数组作为输入创建数组的过程。