这个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)

已经暗示要对观察结果进行解释,但是我仍然对整个解释感到好奇。

解决方法

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个?这里的问题是“用数组制作一个数组”。基本上:

1:3
ans =
     1     2     3
1:(3:5)
ans =
     1     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:11mod(7:11,5)。然后,它逐个元素地减去两个数组,并向每个元素加5。这里有趣的是,7:12 - mod(7:11,5) + 5可以工作,而(7:12) - mod(7:11,5) + 5会由于不兼容的数组大小而导致错误。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...