这个 MATLAB 代码(涉及冒号运算符)是如何解析的?
How is this MATLAB code (involving colon operator) resolved?
最近想计算几个值的下一个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:11
和 mod(7:11,5)
。然后它按元素减去两个数组并将每个元素加 5。有趣的是,7:12 - mod(7:11, 5) + 5
会起作用,而 (7:12) - mod(7:11, 5) + 5
会由于不兼容的数组大小而导致错误。
最近想计算几个值的下一个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:11
和 mod(7:11,5)
。然后它按元素减去两个数组并将每个元素加 5。有趣的是,7:12 - mod(7:11, 5) + 5
会起作用,而 (7:12) - mod(7:11, 5) + 5
会由于不兼容的数组大小而导致错误。