元素/向量/向量列表的所有可能组合(笛卡尔积)

时间:2016-11-17 16:41:48

标签: matlab vector octave permutation cartesian-product

我有几个向量或向量列表,并希望弥补其条目的所有可能的连接。这是一个例子:

a1=4;
a2=[1,6;1,9;6,9];
a3=[2;7];

这一切都应该导致:

[4,1,6,2]
[4,1,6,7]
[4,1,9,2]
[4,1,9,7]
[4,6,9,2]
[4,6,9,7]

我认为我的问题与此问题相似:Generate all possible combinations of the elements of some vectors (Cartesian product)但我无法对问题的答案进行调整。

修改 再次感谢您的回答和更正!正如烧杯已经说它的作品就像八度音阶的魅力。现在,我还想让它在单元格数组(或任何其他能更好地适应潜在解决方案的结构)中任意数量的a更灵活一点。我编写了一个字符串然后eval来完成它。但这对我来说似乎并不优雅。是否有可能让它更多...算法?

1 个答案:

答案 0 :(得分:2)

我正在回答使用MATLAB,希望同样的代码也适用于Octave。

以下是您链接的问题中基于Amro's answer的解决方案:

a1=4;
a2=[1,6;1,9;6,9];
a3=[2;7];

nRows = [size(a1,1), size(a2,1), size(a3,1)];

[x,y,z] = ndgrid(1:nRows(1),1:(nRows(2)),1:(nRows(3)));
cartProd = [a1(x(:),:) a2(y(:),:) a3(z(:),:)];

结果是:

cartProd =

     4     1     6     2
     4     1     9     2
     4     6     9     2
     4     1     6     7
     4     1     9     7
     4     6     9     7

这与您展示的顺序略有不同,但我认为它对您仍然有用。