2017-12-07 13 views
2

私は可能な組み合わせのすべてを見つけようとしていますが、要素の順序も私の問題にとって重要です。Matlabで可能なすべての組み合わせ

たとえば、セットset={A, B, C}の場合、可能なサブセットはsubsets={A},{B},{C},{A,B},{A,C},{B,A},{B,C},{C,A},{C,B},{A,B,C},{A,C,B},{B,A,C},{B,C,A},{C,A,B},{C,B,A}です。

これを見つけるためのMatlab関数はありますか?

ありがとうございます。

答えて

3

私はこれらすべてのforを見るために耐えることができませんでしたそうここで、Tommaso's answerにループないループを有する一つだ:これはトマソの第二のゾルのように、各要素の一方順列とセル配列を返し

a = {'A' 'B' 'C'}; 

% Build an array of binary vectors which we will use to select subsets of 
% the array to be permuted 
nGroups = 2^numel(a) - 1; 
selector = dec2bin(1:nGroups) == '1'; % hack to convert numbers to binary vectors 
selectVectors = arrayfun(@(x) selector(x,:), 1:size(selector, 1), 'UniformOutput', false); 

% Get the permutations of each subset of the array 
permsCell = cellfun(@(s) perms(a(s)), selectVectors, 'UniformOutput', false); 

% Rearrange the permutations into a one-dimensional cell array with one 
% permutation in each element 
rowsAsCells = @(ca) arrayfun(@(x) ca(x,:), 1:size(ca,1), 'UniformOutput', false); 
permsAsRows = cellfun(rowsAsCells, permsCell, 'UniformOutput', false); 
result = cat(2, permsAsRows{:}); 

ution。このバージョンであることが好ましいかどうか

好みの問題である;-)

+0

注種々 '* fun'関数その*は*内部ループ、および同等の明示的なループよりも一般的に少ないパフォーマンス。それでも、Twitterのコーディングが望ましい場合があります。 – excaza

+0

ハハ。私は、 'cellfun'と' arrayfun'は時には等価なループの実装よりも読みやすいと信じています(厄介な 'UniformOutput'ビジネスではそうでないとそうです)。私はこれが必然的にこれらのケースの1つであると主張していない。 – nekomatic

1
a = {'A' 'B' 'C'}; 
a_len = numel(a); 

res_len = 0; 

for i = 1:a_len 
    res_len = res_len + (factorial(a_len)/factorial(a_len - i)); 
end 

res = cell(res_len,a_len); 
res_off = 1; 

for i = 1:a_len 
    bin = nchoosek(a,i); 

    for j = 1:size(bin,1) 
     bin_j = bin(j,:); 

     per = perms(bin_j); 
     per_hei = size(per,1); 

     res_ran = res_off + per_hei - 1; 
     res(res_off:res_ran,:) = [per repmat({''},size(per,1),a_len - i)]; 
     res_off = res_off + per_hei; 
    end 
end 

また、あなたは同じサイズの列に編成結果をしたいのではなく、可変の長さの単一のベクターに挿入されていない場合:

a = {'A' 'B' 'C'}; 
a_len = numel(a); 

res_len = 0; 

for i = 1:a_len 
    res_len = res_len + (factorial(a_len)/factorial(a_len - i)); 
end 

res = cell(res_len,1); 
res_off = 1; 

for i = 1:numel(a) 
    bin = nchoosek(a,i); 

    for j = 1:size(bin,1) 
     bin_j = bin(j,:); 
     per = perms(bin_j); 

     for y = 1:size(per,1) 
      res{res_off,1} = {per{y,:}}; 
      res_off = res_off + 1; 
     end 
    end 
end 
関連する問題