如何获得矢量的所有组合?

时间:2017-10-19 18:34:59

标签: matlab math permutation

我想找到一个矢量的所有可能的变化(组合),从该矢量中选择不同数量的元素。

例如,假设我有矢量:

x = [1 2 3 4 5];

我可以确定每个选定元素数量的组合数量:

x = [1 2 3 4 5]';

n = numel(x);
for k = 1:n
   combs(k) = nchoosek(n,k);
end

sum(combs)

这导致:

combs = 5 10 10 5 1

sum(combs) = 31

我想要一种方法将所有这31个组合存储在一个数组中,例如一个单元格数组,其中n个单元格,每个都是一个数组,其中每一行都是元素的向量组合。 / p>

e.g。在k = 4

combs{4} = 

1 2 3 4
1 2 3 5
1 2 4 5
1 3 4 5
2 3 4 5

是否存在执行此操作的现有功能,或者最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

使用向量作为第一个输入来调用nchoosek,使用arrayfun(或等效expression)循环选择的元素数量:

for

答案 1 :(得分:0)

以下是使用dec2binfindaccumarray的方法:

x = [1 2 3 4 5];
[a b] = find(dec2bin(1:2^numel(x)-1)=='1');
combs = accumarray(a,x(b),[],@(c){c});