这个MATLAB代码(涉及冒号操作符)是如何解析的?

这个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)向量 附录

最近,我想计算几个值中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)
这已经暗示了对观察结果的解释,但我仍然对整个解释感到好奇。

如您所见,括号(
()
)首先被解算,这意味着
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记录了使用冒号和数组作为输入创建数组的过程。