【问题标题】:Find duplicates of pairwise comparisons in MATLAB在 MATLAB 中查找成对比较的重复项
【发布时间】:2018-05-22 00:16:48
【问题描述】:

我有一个非常大的数据集,如下所示:

x1 x2
2  5
4  10
5  2
....

我想找到所有具有相同值(重复)的行,但是,不管顺序如何。在上面的示例中,我想找到第 1 行和第 3 行,因为它们都有值 2 和 5。

由于我有大约 14000 次比较,我如何使用 MATLAB 以有效的方式做到这一点?

【问题讨论】:

  • [2 5; 4 10; 5 2; 6 7; 6 7] 的输出是什么?
  • @LuisMendo 不知何故是一个矩阵,其中每一行都有包含重复值的行的索引。所以在这个例子中可能是[1 3; 4 5]
  • @lala_12 这对于[2 5; 4 10; 5 2; 6 7; 6 7; 6 7] 将失败,因为您想要输出[1 3; 4 5 6],它不是一个有效的矩阵。给我们一个“也许”你想要的定义不是一个明确定义的问题,请决定你喜欢的特定输出格式。像{{2,5}, {1,3}; {6,7}, {4,5,6}} 这样的单元格数组可以工作,但并不优雅。
  • @Wolfie 如果你有[1 3 0; 4 5 6],问题就会得到解决。但是,我没有考虑按照您的建议制作单元阵列。我更喜欢那个输出。
  • 可以使用sort(...,2)uniqueaccumarray 完成。我现在没有时间(也没有电脑);我会在当天晚些时候尝试这样做

标签: matlab loops dataframe duplicates


【解决方案1】:

首先,按列排序。这意味着每一行都将首先具有最低值,并且无论原始顺序如何,您都在比较行。

arr = [2 5; 4 10; 5 2; 6 7; 6 7; 6 7];
arrSorted = sort( arr, 2 );

然后使用unique 获取所有唯一行及其对应的索引。

[uRows, ~, iRows] = unique( arrSorted, 'rows' );

输出:

>> uRows = [2  5 
            4 10
            6  7]
>> iRows = [1
            2
            1
            3 
            3
            3]

数组iRowsarr 中每一行在uRows 内的索引,因此例如第三行[6 7] 出现在arr 的最后三行中(以某种顺序)。

您可能需要多种格式的结果。如果您需要的不仅仅是上述数组,您可以考虑使用元胞数组。一个简单的循环将是创建它的一种清晰方法:

c = cell(size(uRows,1), 2);
for ii = 1:size(uRows,1)
    c{ii,1} = uRows(ii,:);         % This row
    c{ii,2} = find( iRows == ii ); % Indices of this row value within 'arr'
end

【讨论】:

    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2021-01-13
    相关资源
    最近更新 更多