使用MATLAB的多个向量的所有可能的交集

时间:2013-10-11 12:20:22

标签: matlab vector set-intersection

我有一组向量A i ,使得i = 1 ... N;其中N可以非常大,并且向量包含除0之外的整数。所有向量都具有相同的长度,因此很好。我需要一个函数,其输出是一个单元格数组C(数据类不一定是单元格btw),这样C索引实际上是向量元素,单元格内容是共享内容的A向量的i索引。

  

F:A i - > ç

示例:

A1 = [1 2 4], 
A2 = [3 4 5], 
A3 = [4 1 2]

结果C应为

C{1} = [1 3];
C{2} = [1 3];
C{3} = [2];
C{4} = [1 2 3];
C{5} = [2];

当然我想避免使用elementwise for循环。

2 个答案:

答案 0 :(得分:1)

我第一次误解了,我相信现在这是正确的:

A = [1 2 4
     3 4 5
     4 1 2];


Av = num2cell(unique(A(:))', 1);
C = cellfun(@(x)(find(any((A == x)'))), Av, 'UniformOutput', false)

结果

C{1} = [1 3];
C{2} = [1 3];
C{3} = [2];
C{4} = [1 2 3];
C{5} = [2];

答案 1 :(得分:0)

我不确定我是否正确理解你的目标,但我认为这会让你大部分时间都在那里:

使用第一个向量中的1个元素创建所有组合,从第二个向量创建1个组合,从第三个向量创建1个组合。

[X,Y,Z] = ndgrid([1 2 3 4 5], [3 4 5 6 7], [4 8 9 11 2])
[X(:) Y(:) Z(:)]

知道这一点并不难以弄清楚如何获得2个向量之间的所有组合。然后添加所有单个元素应该是微不足道的。

您可能需要sort这个到第二维并获取所有unique值。