唯一性在具有NaN条目的表中无法使用 - MATLAB

3

我有一个包含重复行的table,我试图使用Matlab中的unique来删除它们。但是,并不是所有的都可以被删除。这个玩具示例说明了我的问题。你有任何想法如何去除它们吗?

AAA = table(repmat('0122',2,1),repmat('011',2,1),repmat(NaN,2,1))

ans = 

    Var1    Var2    Var3
    ____    ____    ____

    0122    011     NaN 
    0122    011     NaN 

unique(AAA)

ans = 

    Var1    Var2    Var3
    ____    ____    ____

    0122    011     NaN 
    0122    011     NaN 
3个回答

4

您似乎因为NaN值遇到了问题。

文档中隐藏着这样一句话:

unique将NaN值视为不同的值。

我想你可以通过在使用unique之前用虚拟值替换nan值来解决这个问题。


3

简介

Mathworks有关unique的文档如下所述:

C = unique(A) 返回与A中相同的数据,但没有重复项。

如果A是一个表,则unique返回A中唯一的行。表C的行按排序顺序排列。

因此,对于将table作为输入传递给unique的情况,它建议如果你可以识别该表的每个条目,则基本上像unique(....'rows')一样。我们在这里使用的技巧是将所有这些条目转换为单元格数组的单元格,然后识别每个单元格,然后使用那些数值ID与unique(...'rows')一起使用。

函数代码

接下来列出的代码就是这样做的 -

function Tout = unique_table(T)

%// Convert input table into a cell array
Tcell = cellfun(@(x) num2str(x),table2cell(T),'Uni',0);

%// ID all cells of the cell array
[~,~,id_cells] = unique(Tcell);

%// Use the cell IDs to find the unique row IDs
[~,unq_rowid] = unique(reshape(id_cells,size(Tcell)),'rows');

%// Use the row IDs to get the expected table with unique rows
Tout = T(unq_rowid,:);

return;

测试运行

案例#1:原始案例

T = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011     NaN 
    0122    011     NaN 
Tout = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011     NaN 

案例2:修改后的案例

T = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011      56 
    0122    011     NaN 
Tout = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011      56 
    0122    011     NaN 

0

使用Inf代替NaN:

>> AAA = table(repmat('0122',2,1),repmat('011',2,1),repmat(inf,2,1))

AAA = 

Var1    Var2    Var3
____    ____    ____

0122    011     Inf 
0122    011     Inf 

>> unique(AAA)

ans = 

Var1    Var2    Var3
____    ____    ____

0122    011     Inf 

如果Var3的第一个条目是NaN,第二个条目是Inf,那该怎么办?使用这种基于替换的解决方案,两个条目都将变为Inf,因此将被视为重复项,这是不符合预期的。 - Divakar
我通常使用NaN或Inf来初始化变量,以便稍后给它们赋值。关于NaN,在Matlab的网站上有这样的描述:“因为两个NaN不相等,所以涉及NaN的逻辑操作始终返回false,除了不等式测试(NaN ~= NaN)”,如果您打算使用像“unique”这样的逻辑函数(比较),则不建议使用NaN。 - scmg

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