我们说我有5个不同大小的阵列。所有数组都有相同数量的列,在我的情况下为2,但行数不同。我需要找到至少有3个这样的数组中出现的行的元素。
现在,我使用ismember
比较两个数组,然后将该结果与第三个数组进行比较,然后保存在所有三个数组中出现的行值。我为3个阵列的每个可能的组合做这个;基本上在我的情况下,我总共有10个这样的操作。这就像选择五分之三而不重复一样。
它有效,但我正在寻找更有效的实现。特别是,我正在寻找任何可以通过投票执行此操作的实现。它就像拥有不同大小的集合,并试图找到大多数集合中出现的元素,在我的例子中,有5个阵列中的5个。
答案 0 :(得分: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,:);
答案 1 :(得分:0)
感谢 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
个出现的行,在我的情况下{{1} }。基本上,我首先将所有数组转储到一个大矩阵(numMajority = 3
)中,然后找到该矩阵的唯一行。最后,我计算每个唯一行的数量,并将显示在大多数数组中的点返回为result
。