【问题标题】:Finding equal rows between multiple arrays of different sizes by voting通过投票在多个不同大小的数组之间找到相等的行
【发布时间】:2017-11-19 05:12:21
【问题描述】:

假设我有 5 个不同大小的数组。所有数组都有相同的列数,在我的例子中是 2,但行数不同。我需要找到至少出现在 3 个这样的数组中的行的元素。

现在,我使用ismember 比较两个数组,然后将该结果与第三个数组进行比较,然后保存所有三个数组中出现的行值。我对 3 个数组的每一种可能组合都这样做;基本上就我而言,我总共有 10 个这样的操作。这就像在没有重复的情况下从 5 个中选择 3 个。

它有效,但我正在寻找更有效的实现。特别是,我一直在寻找任何可以通过投票来执行此操作的实现。这就像拥有不同大小的集合并试图找到出现在大多数集合中的元素,在我的例子中是 5 个数组中的 3 个。

【问题讨论】:

  • @ excaza:据我了解,link 中提供的解决方案更适合比较每对数组。例如,它将所有数组保存在一个单元格中,然后找到每对数组的交集。最后,找到唯一的行以及它们出现的数组。在我的问题中,将所有数组放在一个大矩阵中似乎更有效。我认为比较每一对数组都涉及到更多的比较,这里似乎效率不高。

标签: arrays matlab compare


【解决方案1】:

不确定您所说的投票是什么意思,但我认为符合您的要求。

它从数组中创建 1 个包含所有行的唯一大矩阵。对每个单独的数组执行一个 ismember 通过唯一数组的行。将ismember 相加以计算每个唯一行在您的数组集中存在的次数。

然后您可以使用该计数返回一个至少出现 minNum 的新数组。

你可以这样称呼它:

>> [outRows, uRows, memCount]= getRowDuplicates(3,a,b,c,d,e)

a,b,c,d,e 是数组,3 是最少出现次数

function [outRows, uRows, memCount]= getRowDuplicates(minNum,varargin)

uRows = unique(vertcat(varargin{:}),'rows');
memCount = false(size(uRows,1),1);
for j = 1:nargin-1
    memCount = memCount + ismember(uRows,varargin{j},'rows');    
end
rowIdx = memCount >= minNum;
outRows = uRows(rowIdx,:);

【讨论】:

    【解决方案2】:

    感谢 Aero Engy 的解决方案!这是我自己的尝试,在重写了我最初的、不是很有效的实现之后。我想有人可能会觉得它有用:

    function [majorityPts] = MajorityPointSelection(Mat, numMajority)
        result = vertcat(Mat{:});
        allUniq = unique(result(:,1:2),'rows');
        numUniq = size(allUniq,1);
    
        allUniq = [allUniq zeros(numUniq,1); zeros(size(result,1)-numUniq, 3)];
        for i = 1:numUniq
            sumNumRow = sum(result(:,1:2) == allUniq(i,1:2),1);
            allUniq(i,3) = sumNumRow(1);
        end
    
        allUniq(numUniq+1:end,:) = [];
        majorityPts = allUniq(allUniq(:,3)>=numMajority,1:2);
    end
    

    这里的Mat 是一个单元格,其中包含我要比较的所有数组,以便找到至少出现在其中numMajority 中的行,在我的情况下为numMajority = 3。基本上,我首先将所有数组转储到一个大矩阵 (result) 中,然后找到该矩阵的唯一行。最后,我计算每个唯一行的数量,并将出现在大多数数组中的点返回为majorityPts

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2021-01-05
      相关资源
      最近更新 更多