我有n
个10, 15, 18, ...
状态,我希望在长度为m
的数组中生成所有状态的组合。
例如,如果m=5
和n=2
(states={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中生成这个数组?
答案 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
请注意,对于m
和n
的高值,这会产生糟糕的表现。
答案 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
;那么你可以在之后理清所有不需要的组合 - 不清楚你不感兴趣的组合(例如,它可能是不是所有相同状态的元素的组合,或者与每个组合中的至少一个的组合代表的各州)。