Matlab中唯一函数的输出



我在Matlab中使用unique函数,我对这样一个函数的输出感到困惑。

考虑以下简单代码

rng default
T=randn(232,50); %232*50
equalorder=randsample(232,80802,true); %80802*1
T_extended=T(equalorder,:); %80802*50

通过构造,我期望T_extended的大小为232。事实上,

S=size(unique(T_extended,'rows'),1); %232

现在,考虑由我的一些代码产生的特定Tequalorder函数(Tequalorder上传到这里

https://filebin.net/603zn7mt2efzq91c

不幸的是,我的代码太长,无法复制,我认为问题可能是数字问题(。让我们将上面的代码应用于这些数组:

clear
load matrices %T, equalorder
T_extended=T(equalorder,:);

但是,如果我做

S=size(unique(T_extended,'rows'),1);

我得到的是S=4694,而不是S=232。为什么?

再现问题所需的代码或数据应包含在问题本身中,因为外部链接将来可能会停止工作。然而,在这种情况下,很容易确定导致问题的模式(见下文(,因此该问题和该答案应该是独立的


在链接的示例中,T在条目(216,37):处包含NaN

>> T(216,37)
ans =
NaN

(这是唯一这样的条目(:

>> nnz(isnan(T))
ans =
1

通过设计,NaN值彼此不相等。因此,当计算unique(T_extended, 'rows')时,与T的原始216行相对应的T_extended的所有行被计数为不同。这就是导致唯一行数增加的原因。如果不考虑37-列(这是唯一一个包含NaN的列(,则会得到预期的结果:

>> S=size(unique(T_extended(:,[1:36 38:end]),'rows'),1)
S =
232

让我们计算一个NaN条目在T_extended:中出现的次数

>> nnz(isnan(T_extended))
ans =
4465

(当然,这是因为(:

>> sum(equalorder==216)
ans =
4465

这意味着当包含NaN的行的每个重复被计数为不同行时,唯一行的计数增加4465 - 14465 - 1 + 232就是4696,这就是你得到的结果。

相关内容

  • 没有找到相关文章

最新更新