如果我理解正确,您有许多对:Mat1
, Mat2
, Mat3
, ... MatN
。现在您要查找唯一对,然后找出每个唯一对出现在哪个集合中。
如果你有大量的集合,我建议你开始使用一个单元格数组来保存它们,这会让事情变得更容易:
N = 3; % total number of data sets
Mat = cell(N,1);
Mat{1} = [1 2;
1 3;
2 4;
3 1;
4 5];
Mat{2} = [1 3;
2 6;
3 1;
3 5];
Mat{3} = [2 6;
2 5;
3 1;
5 2];
% etc.
首先让我们找到唯一的对:
uniq_pairs = unique(cat(1,Mat{:}),'rows');
M = size(uniq_pairs ,1);
然后使用ismember检查哪些集合包含哪些对:
matcontpair = false(M,N); %preallocate
for ii=1:N % unavoidable loop
matcontpair(:,ii) = ismember(uniq_pairs,Mat{ii},'rows');
end
要将此交集矩阵转换为每对的一组矩阵数,请再次循环遍历它并将最终结果存储在单元数组中(您不能使用数组,因为它们的大小可能不同(仅找到某些对一次,另外两次,另外三次......)
pair_occurence= cell(M,1);
d=1:N;
for jj=1:M
pair_occurence{jj} = d(matcontpair(jj,:));
end
现在您有一个包含唯一对uniq_pairs
的大小矩阵和一个大小Mx2
为的出现单元格数组:每个单元格对应于一对并包含存在该对的矩阵列表。pair_occurence
Mx1
如果要从列表中删除仅存在于一个矩阵中的对,请使用以下命令:
% find them
lonely_pairs = cellfun(@numel,pair_occurence)<2;
% and destroy them
uniq_pairs(lonely_pairs,:) = [];
pair_occurence(lonely_pairs) = [];