繁体   English   中英

Matlab中唯一函数的输出

[英]Output of unique function in 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 -the 列(这是唯一包含NaN ),您会得到预期的结果:

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

让我们计算NaN条目在T_extended出现的T_extended

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

(当然,这是因为):

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM