我得到了一段奇怪的代码来调试哪个我认为应该抛出一个异常,但它却产生了奇怪的结果。把它减少到这两行:
EDU>> A={0,0}
A =
[0] [0]
EDU>> A{1:2}==A{2:1}
ans =
1
为什么两个不相等的逗号分隔列表的比较为真?
答案 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