matlab - 这个 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)
这已经暗示了对观察结果的解释,但我仍然对整个解释感到好奇。
解决方案
如您所见,括号 , ()
, 被首先解决,这意味着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
这显示了正在发生的事情。如果您使用冒号初始化数组,但端点为数组,则 MATLAB 仅使用第一个值。尽管听起来很奇怪,但它是记录在案的行为。
mod(7:11,5)
生成一个数组,[2 3 4 0 1]
. 然后从 中减去11
并5
添加该数组[14 13 12 16 15]
。现在,正如我们在文档中看到的那样,只考虑第一个元素。如您所示,7:[14 13 12 16 15]
被解析为并将产生 8 个值。7:14
首先(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
由于数组大小不兼容会导致错误。
推荐阅读
- compiler-construction - LR(1) 表结构混乱
- sql-server - 更改数据库服务器上现有 SQL 用户的登录名(Windows 用户)
- apache - Apache 2.2.15 在上传某种类型的 pdf 文件时响应状态 44
- java - System.out.println:为什么不可打印字符只显示在可打印字符之前而不显示之后?
- salesforce - 复合模板被多次发送
- windows - 有没有办法在 PowerShell 中显示同时兼容 Windows 系统和 MacOS 的弹出消息框?
- python - 如何在 Python 的 sentry sdk 中拥有多个全局 DSN?
- asp.net-core-mvc - IFormFile 上传图片 ASP.NET 核心 MVC
- c# - 消息代理中的消息格式
- android - Kotlin - 同伴对象 fun 有什么作用?