如何解决这个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:11
和mod(7:11,5)
。然后,它逐个元素地减去两个数组,并向每个元素加5。这里有趣的是,7:12 - mod(7:11,5) + 5
可以工作,而(7:12) - mod(7:11,5) + 5
会由于不兼容的数组大小而导致错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。