Matlab:unique函数的行为

6

我目前正在将代码从R2012a迁移到R2013b。

我注意到unique函数的行为已经发生了变化:

R2012a

->

R2013b

>> size(unique([]))

ans =

     0     0

R2013b

>> size(unique([]))

ans =

     0     1

对我来说,0x0矩阵经过去重后变成0x1矩阵似乎是违反直觉的。这本质上就是unique函数所做的。有人能解释一下这个逻辑吗?


2
这可能与之相关:使用for循环迭代空矩阵 - Dennis Jaheruddin
2个回答

7
该行为在R2013a版本中发生了改变,如果需要旧的行为,请使用: size(unique([],'legacy')) 如果需要为两个版本编写代码,建议编写一些函数,调用unique(x,'legacy')进行新版本,调用unique(x)进行旧版本。
顺便说一下:unionintersectsetdiffsetxorismember也面临同样的问题。

1
这里是发行说明,请展开所有2013a并搜索“unique”。 - Dennis Jaheruddin
@DennisJaheruddin 我查看了发布说明,但没有找到提到它的地方。我是瞎了吗? - Eric Salemi
1
好的,在“数学”下找到了。有道理。 - Eric Salemi

1
我不知道这是否是原因,但它确实有优势。
现在你会发现unique(M)unique(M(:))输出相同,即使M为空。
示例:
M = magic(5);
isequal(size(unique(M)), size(unique(M(:)))); 
M = [];
isequal(size(unique(M)), size(unique(M(:)))); 

在旧版本的Matlab中,后者会返回false,这可能会令人困惑。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接