20

これが私が抱えている問題の簡略版です。ベクトルがあるとします

p=[1 5 10] 

そしてもう一つ

q=[.75 .85 .95]

そして、次のマトリックスを作成したいと思います。

res=[1, .75;
     1, .85;
     1, .95;
     5, .75;
     5, .85;
     5, .95;
    10, .75;
    10, .85;
    10, .95]

これはデカルト積とも呼ばれます。どうやってやるの?

4

3 に答える 3

44

1 つの方法を次に示します。

[X,Y] = meshgrid(p,q);
result = [X(:) Y(:)];

出力は次のとおりです。

result =

    1.0000    0.7500
    1.0000    0.8500
    1.0000    0.9500
    5.0000    0.7500
    5.0000    0.8500
    5.0000    0.9500
   10.0000    0.7500
   10.0000    0.8500
   10.0000    0.9500
于 2012-03-23T09:11:08.337 に答える
4

@nibot で説明されているものと同様のアプローチは、matlab central file-exchangeにあります。

解を任意の数の入力セットに一般化します。これは、コードの簡略化されたバージョンになります。

function C = cartesian(varargin)
    args = varargin;
    n = nargin;

    [F{1:n}] = ndgrid(args{:});

    for i=n:-1:1
        G(:,i) = F{i}(:);
    end

    C = unique(G , 'rows');
end

例えば:

cartesian(['c','d','e'],[1,2],[50,70])

ans =

    99     1    50
    99     1    70
    99     2    50
    99     2    70
   100     1    50
   100     1    70
   100     2    50
   100     2    70
   101     1    50
   101     1    70
   101     2    50
   101     2    70
于 2015-10-22T14:26:27.443 に答える
1

次の関数 はcartesian_product、文字列配列を含むあらゆるタイプの入力を処理でき、入力変数の名前と一致する列名を持つテーブルを返します。var1変数ではない入力には、var2、 などの名前が付けられます。

function tbl = cartesian_product(varargin)
    names = arrayfun(@inputname, 1:nargin, 'UniformOutput', false);
    
    for i = 1:nargin
        if isempty(names{i})
            names{i} = ['var' num2str(i)];
        end
    end
    
    rev_args = flip(varargin);
    
    [A{1:nargin}] = ndgrid(rev_args{:});

    B = cellfun(@(x) x(:), A, 'UniformOutput', false);
    C = flip(B);
    
    tbl = table(C{:}, 'VariableNames', names);
end
>> x = ["a" "b"];
>> y = 1:3;
>> z = 4:5;
>> cartesian_product(x, y, z)

ans =

  12×3 table

     x     y    z
    ___    _    _

    "a"    1    4
    "a"    1    5
    "a"    2    4
    "a"    2    5
    "a"    3    4
    "a"    3    5
    "b"    1    4
    "b"    1    5
    "b"    2    4
    "b"    2    5
    "b"    3    4
    "b"    3    5
>> cartesian_product(1:2, 3:4)

ans =

  4×2 table

    var1    var2
    ____    ____

     1       3  
     1       4  
     2       3  
     2       4
于 2021-04-28T23:29:15.250 に答える