Matlab 对于不相等的列表,eq返回true

Matlab 对于不相等的列表,eq返回true,matlab,Matlab,我有一段奇怪的代码要调试,我认为它应该抛出一个异常,但它产生了完全奇怪的结果。将其缩减为以下两行: EDU>> A={0,0} A = [0] [0] EDU>> A{1:2}==A{2:1} ans = 1 为什么比较两个不相等的逗号分隔列表是正确的?因为它们都是0。尝试A={1,2}然后您将得到ans=0代码行A{1:2}==A{2:1}没有检查两个逗号分隔列表的相等性,因为2:1是一个空数组。我认为预期的索引是2:-1:1;这将

我有一段奇怪的代码要调试,我认为它应该抛出一个异常,但它产生了完全奇怪的结果。将其缩减为以下两行:

EDU>> A={0,0}

A = 

    [0]    [0]

EDU>> A{1:2}==A{2:1}

ans =

     1

为什么比较两个不相等的逗号分隔列表是正确的?

因为它们都是
0
。尝试
A={1,2}
然后您将得到
ans=0
代码行
A{1:2}==A{2:1}
没有检查两个逗号分隔列表的相等性,因为
2:1
是一个空数组。我认为预期的索引是
2:-1:1
;这将创建逗号分隔的列表,但也会引发错误,因为
=
无法处理该列表

然而,奇怪的是,
A{1:2}==A{2:1}
在我的脑海中产生了任何类型的有效输出。代码的字面意思是
A{1:2}==A{[]}
,问题是“什么是
A{[]}
?”根据我的MATLAB R2014b,没有任何意义,但即使是带有空索引的简单双精度数组也会返回空双精度。我猜实际的内容,也就是被
{
}
检索到的内容,是的,没什么

但是,MATLAB是如何产生
真的
的答案的呢? 从命令窗口中考虑下面的代码:

>> A = {0,0}; A{1:2} == A{[]}
ans =
     1

>> A = {0,1}; A{1:2} == A{[]}
ans =
     0
由此,我推测MATLAB将逗号分隔列表作为
eq
的前两个参数,并将
A{[]}
不添加任何内容,并将其解释为

eq(0,0,A{[]})
eq(0,1,A{[]})
显然,这是有效的语法(
eq(a,b,)
不是)。对单元数组的元素进行二进制操作非常有趣。这也适用于:

>> A = {[2,3],[3,2]};
>> A{1:2} .* A{[]}
ans =
     6     6

>> A{1:2} ./ A{[]}
ans =
    0.6667    1.5000
只是为了好玩,因为我觉得这很有趣:

>> A = {rand(2),rand(2,1)};
>> A{1:2} \ A{[]}
ans =
    0.8984
   -0.7841

但我想这是有道理的。解析器查找一个标记,后跟一个中缀运算符,后跟另一个标记。它将中缀运算符解析为其函数,然后将左标记和右标记依次放入参数列表中。 我想我只是觉得“无”的存在很奇怪;尽管这可以解释
[1,2,3]
是如何有效的语法

也就是说,我确信这是语言的一个怪癖,而不是一个bug或特性

当然,了解实际情况的唯一方法是深入了解MATLAB如何解释单元阵列扩展和运算符的应用。当然,我没有这方面的经验,也没有所需的资源(我可以想象)