web-dev-qa-db-ja.com

いくつかのベクトルの要素の可能な組み合わせをすべて生成します(デカルト積)

与えられた数のベクトルの要素の可能なすべての組み合わせを生成したいと思います。

たとえば、[1 2][1 2]および[4 5]要素を生成したい:

[1 1 4; 1 1 5; 1 2 4; 1 2 5; 2 1 4; 2 1 5; 2 2 4; 2 2 5]

問題は、組み合わせを計算する必要があるベクトルの数がわからないことです。この場合のように3か、10があり、一般化が必要です。 MATLABでこれを手伝ってもらえますか?このタスクを実行できる定義済みの関数は既にありますか?

32
Simon

FileExchangeで [〜#〜] allcomb [〜#〜] 関数を試してください。

セル配列にベクトルを保存する場合、次のように実行できます。

a = {[1 2], [1 2], [4 5]};
allcomb(a{:})
ans =

     1     1     4
     1     1     5
     1     2     4
     1     2     5
     2     1     4
     2     1     5
     2     2     4
     2     2     5
17
yuk

[〜#〜] ndgrid [〜#〜] 関数を使用してこのソリューションを検討してください。

sets = {[1 2], [1 2], [4 5]};
[x y z] = ndgrid(sets{:});
cartProd = [x(:) y(:) z(:)];

cartProd =
     1     1     4
     2     1     4
     1     2     4
     2     2     4
     1     1     5
     2     1     5
     1     2     5
     2     2     5

または、任意の数のセットの一般的なソリューションが必要な場合(変数を手動で作成する必要なし)、次の関数定義を使用します。

function result = cartesianProduct(sets)
    c = cell(1, numel(sets));
    [c{:}] = ndgrid( sets{:} );
    result = cell2mat( cellfun(@(v)v(:), c, 'UniformOutput',false) );
end

必要に応じて、結果を並べ替えることができます。

cartProd = sortrows(cartProd, 1:numel(sets));

また、上記のコードでは、セットに重複値がないかどうかはチェックされません(例:{[1 1] [1 2] [4 5]})。必要に応じて、この1行を追加します。

sets = cellfun(@unique, sets, 'UniformOutput',false);
49
Amro

matlabで 'combvec'命令を使用することもできます

    no_inp=3 % number of inputs we want...in this case we have 3 inputs                  
    a=[1 2 3]
    b=[1 2 3]
    c=[1 2 3]

    pre_final=combvec(c,b,a)';
    final=zeros(size(pre_final));

    for i=1:no_inp
    final(:,i)=pre_final(:,no_inp-i+1);
    end
    final 

それが役に立てば幸い。幸運を。

0