如何在数组中生成n个元素的所有组合?

时间:2014-11-24 09:04:06

标签: matlab combinations

我有n10, 15, 18, ...状态,我希望在长度为m的数组中生成所有状态的组合。

例如,如果m=5n=2states={10,15}),我想生成所有可能的组合,例如:

comb = { 10 10 10 10 15

         10 10 10 15 10

         10 10 10 15 15

         ...

         15 15 15 15 10 }

每一行应包含10, 15的一种可能组合。如何在MATLAB中生成这个数组?

2 个答案:

答案 0 :(得分:0)

一种方法是:

m = 4;
n = 2;
states = [10, 15];
v = mod(perms(1:(2*(m-1))),n) + 1;
ind = unique(v(:,1:m),'rows');
comb = states(ind)

comb =

    10    10    10    15
    10    10    15    10
    10    10    15    15
    10    15    10    10
    10    15    10    15
    10    15    15    10
    10    15    15    15
    15    10    10    10
    15    10    10    15
    15    10    15    10
    15    10    15    15
    15    15    10    10
    15    15    10    15
    15    15    15    10

请注意,对于mn的高值,这会产生糟糕的表现。

答案 1 :(得分:0)

尝试类似:

n = 5;
states = [10,15];
m = numel(states);
sz = m*ones(1,n);
idx = {0};
idx = repmat(idx,1,n);
comb = zeros(m^n,n);
for i = 1:(m^n)
[idx{:}] = ind2sub(sz,i);
comb(i,:) =states([idx{:}]);
end

这将为您提供所有可能的组合,并将它们放入矩阵comb;那么你可以在之后理清所有不需要的组合 - 不清楚你不感兴趣的组合(例如,它可能是不是所有相同状态的元素的组合,或者与每个组合中的至少一个的组合代表的各州)。