matlab - 这个 MATLAB 代码(涉及冒号运算符)是如何解析的?

标签 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) 向量?


补充:我发现第一个命令也可以写成:

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

这显示了正在发生的事情。如果您使用冒号初始化一个数组,但将结束点作为数组,则 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 会由于不兼容的数组大小而导致错误。

关于matlab - 这个 MATLAB 代码(涉及冒号运算符)是如何解析的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64570829/

相关文章:

python - 图像处理中的重复高斯模糊

matlab - 如何在matlab中删除开头和结尾的空格?

c++ - 为 x86 而不是 x64 编译时出错

c - && 优先于 ||

xml - 冒号是 XML 标记名称中合法的第一个字符吗?

oop - Lua 脚本抛出错误 "attempt to call a nil value (field ' 存款')"

java - 什么是冒号(:) operator do?

matlab - 如何对矩阵中每一行的每 n 列进行平均?

arrays - MATLAB中没有for循环的多个数组的交集

php - 代码块的增量运算符和赋值运算符的总统和结合性是什么