对于非相等列表,eq返回true

时间:2015-02-05 00:37:58

标签: matlab

我得到了一段奇怪的代码来调试哪个我认为应该抛出一个异常,但它却产生了奇怪的结果。把它减少到这两行:

EDU>> A={0,0}

A = 

    [0]    [0]

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

ans =

     1

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

2 个答案:

答案 0 :(得分:4)

代码行A{1:2}==A{2:1}未检查两个逗号分隔列表的相等性,因为2:1是一个空数组。我认为预期的索引是2:-1:1;这将创建一个以逗号分隔的列表,但也会抛出错误,因为==无法处理该列表。

然而,奇怪的是A{1:2}==A{2:1}在我的脑海中产生了任何类型的有效输出。代码字面上是A{1:2} == A{[]},问题是"什么是A{[]}?"根据我的MATLAB R2014b,没有什么,这是有道理的,但即使是一个带有空索引的简单双数组也会返回一个空的double。我想实际的内容,即{}所检索的内容,不是这样,是的。是的。

但是MATLAB如何产生true的答案? 请从命令窗口中考虑以下代码:

>> 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

但我觉得这很有道理。解析器找到一个标记,后跟一个中缀运算符,后跟另一个标记。它将中缀运算符解析为其函数,然后依次将左右标记放入参数列表中。 我想我发现"没有什么&#34 ;;虽然这可以解释[1,2,3,]是如何有效的语法。

那就是说,我确定这是语言的怪癖而不是错误或功能。

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

答案 1 :(得分:0)

因为两者都是0。尝试A = {1, 2},然后您将获得ans = 0