假设我有 5 个不同大小的数组。所有数组都有相同数量的列,在我的例子中为 2,但行数不同。我需要找到至少出现在 3 个此类数组中的行元素。
现在,我使用 ismember
比较两个数组,然后将该结果与第三个数组进行比较,然后保存所有三个数组中出现的行值。我对 3 个数组的每个可能组合执行此操作;基本上就我而言,我总共有 10 个这样的操作。这就像从 5 个中选择 3 个而不重复。
它有效,但我正在寻找更有效的实现。特别是,我正在寻找任何可以通过投票来执行此操作的实现。这就像拥有不同大小的集合并试图找到出现在大多数集合中的元素,在我的例子中是 3 个数组中的 5 个数组。
不确定你所说的投票是什么意思,但我认为这是你正在寻找的。
它为数组中的所有行创建 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,:);
感谢 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
返回。