2017-06-26 16 views
2

Bは配列です。 B = [1 2 1]場合は、私の予想される出力は次のようになります。[0 0 0], [1 0 0], [1 1 0], [1 1 1], [0 1 1]、などと私の機能は以下の通りです:MATLABで 'すべての組み合わせ'をコーディングするには?

function [output] = AllCombination(B) 
output = []; 
for i = 0:B(1) 
    for j = 0:B(2) 
     for k = 0:B(3) 
      output = [output; [i,j,k]]; 
     end 
    end 
end 

しかし、Bは、任意の長さにすることができます。 Bの長さに適応するためには、どうすればよいですか?

+3

私があなたの質問を正しく理解していれば、[こちら](https://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from)のアプローチを使用することができます'-n-vectors/21895344#21895344)は' vectors = cell(1、numel(B));を定義します。 k = 1の場合:numel(B)、ベクトル{k} = 1:B(k)。 end' –

答えて

2
function [output] = AllCombination(B) 
C = arrayfun(@(x)0:x, B, 'UniformOutput', false); 
D = cell(1,numel(B)); 
[D{:}]=ndgrid(C{:}); 
output = cell2mat(cellfun(@(x)x(:), D, 'UniformOutput', false)); 

最初の行は、範囲を含むセル配列を構成します0から各要素のBまで第2行は、第1行の範囲を渡す3行目の出力を格納するために、正しいサイズの空のセル配列を作成してndgridにします。これにより、範囲のすべての組み合わせが構築されます。最後にcellfunを適用して、それぞれを列ベクトルに変換し、cell2matで連結します。

0

別の解決策:

L = prod(B+1); % length of the resulting array 
output = zeros(L,length(B)); % preallocating memory 
for ii = 1:length(B) % for each column of the output array 
    output(:,ii) = imresize(repmat(0:B(ii),1,prod(B(1:(ii-1))+1)), [1 L], 'nearest')'; 
end 

説明:

repmat(0:B(ii),1,prod(B(1:(ii-1))+1) 

繰り返し0:B(ii)何度でもその前にBさんの全ての要素の積としてシーケンス。カウントがゼロから始まることを考慮に入れるために、すべての要素に+1を追加します。

L = prod(B+1); % length of the resulting array 
output = zeros(L,length(B)); % preallocating memory 
for ii = 1:length(B) % for each column of the output array 
    p = prod(B(1:(ii-1))+1); 
    output(:,ii) = interp1(1:(((B(ii)+1)*p)), repmat(0:B(ii),1,p), linspace(1, (((B(ii)+1)*p)), L), 'nearest'); 
end 
:あなたは、画像処理ツールボックスを持っていない場合は interp1の代わり imresizeを使用して

バージョン:

imresize(...,[1 L], 'nearest')'; 

は、アレイ

編集の長さに、その後のベクトルをスケーリングします

+1

この問題を解決するにはImage Processing Toolboxを使用する必要はありません。 –

関連する問題