通过投票在多个不同大小的数组之间查找相等的行



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

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

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

不确定你所说的投票是什么意思,但我认为这是你正在寻找的。

它为数组中的所有行创建 1 个大的唯一矩阵。 对每个单独的数组进行唯一数组的行ismemberismember相加,以获取数组集中每个唯一行存在的次数。

然后,可以使用该计数返回至少出现次数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,:);

感谢 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返回。

相关内容

  • 没有找到相关文章

最新更新