matlab - Matlab中唯一函数的输出
问题描述
我unique
在 Matlab 中使用该函数,我对这种函数的输出感到困惑。
考虑以下简单代码
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
现在,考虑我的一些代码产生的具体T
和功能(并在此处上传equalorder
T
equalorder
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
包含NaN
在 entry (216,37)
:
>> T(216,37)
ans =
NaN
(这是唯一的此类条目):
>> nnz(isnan(T))
ans =
1
根据设计,NaN
值彼此不相等。因此,在计算时,与原始第 行对应的unique(T_extended, 'rows')
所有行都被视为不同。这就是导致唯一行数增加的原因。如果您不考虑-the 列(这是唯一包含 的列),您会得到预期的结果:T_extended
216
T
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
这意味着当包含的行的4465 - 1
每个重复NaN
被计为不同的行时,唯一行的计数会增加。4465 - 1 + 232
是,这4696
就是你得到的结果。
推荐阅读
- c++ - g ++编译使用带有非相对路径的'include'语句(C ++)
- jquery - jQuery page scroll not working since update
- javascript - 如何在 Reactjs 中渲染 html 元素?
- google-cloud-firestore - How to query firestore with the Dialogflow inline editor to get information
- ignite - How to configure NLog file-based logging in app.config file
- c# - ctrl c, ctrl v 在 DataGridView 上
- python - WindowsContext: OleInitialize() failed: "COM error 0x80010106 RPC_E_CHANGED_MODE (Unknown error 0x0ffffffff80010106)"
- arrays - Swift:追加到字典中返回随机
- svn - 如何仅签出给定父目录的特定子目录未签出
- javascript - 发布空正文(长度为 0 的字符串)