数组 – 为什么加号和一元加号在数组语法中表现得很奇怪?

this question on the plus operator之后,我有一个后续问题.我们知道 plusuplus之间的区别,因此1 2解析为3,就像1 2或甚至1 2.奇怪的事情发生在数组语法中,请考虑以下示例:

>> [1 ++ 2]
ans =
     1     2 % Two unary plusses
>> [1 + + 2]
ans =
     3 % A normal plus and a unary one
>> [1++2]
ans =
     3 % A normal plus and a unary one

同样适用于多个加号,[1 .. 2],因此连续中间的所有加号生成[1 2],所有其他组合(据我测试)导致3.

据我所知,空间在MATLAB中的重要性有限; exp(3 * x / y)与exp(3 * x / y)相同.它们在创建数组时有用:[1 2]将生成1-by-2数组,还有一些其他用途,但分离运算符不是其中之一.

因此我的问题是:为什么[1 2]和[1 2]解决不同?

请注意,minusuminus具有相同的行为,并且解析器足够神奇,可以完全解析[1; ;; 3 – 4,;;;,;] [1; 7].

我怀疑这与数字文字的解析方式有关.特别要考虑以下复杂的例子:

>> [1+2i]

ans =

   1.0000 + 2.0000i

>> [1 +2i]

ans =

   1.0000 + 0.0000i   0.0000 + 2.0000i

>> [1 + 2i]

ans =

   1.0000 + 2.0000i

作为数组分隔符的空间与作为复数的一部分的空间之间存在冲突.

我相信解析器是这样写的,它试图尽可能合理地理解复数(与复杂数组相比).在解析涉及加/减和空格的表达式时,这很容易导致非平凡的行为.

更具体一点:

1 2可能会解析为1 2,因为多个一元加号仍然是一元加号,而一元加号只能作用于2.

但是1 2可能会解析为1(2),其中后者加上作为一元加号使用,留下1 2这是一个单一的“复数”数字.

an inquisitive comment from @Adriaan之后的进一步跟进:

[…] [1 ++ + 2] is [1 2], but [1 + ++ 2] is 3

所以我的正确猜测是解析器从右向左移动.

> [1 2] – > [1(2)] – > [1 2],与
> [1 2] – > [1(2)] – > [1 2].

这也意味着[1 … 2]的任何组合(在第一个连接的加号块中只有一个加号)会给你[3]而如果第一个加号块包含两个或更多,你会得到[1 2].一些伪随机测试似乎验证了这种行为.

当然,直到The MathWorks使他们的解析器开源或记录我们只能猜测.

相关文章
相关标签/搜索