Декартово произведение в MATLAB - PullRequest
16 голосов
/ 23 марта 2012

Вот упрощенная версия проблемы, которая у меня есть. Предположим, у меня есть вектор

p = [1 5 10]

и еще один

q = [. 75 .85 .95].

И я хочу придумать следующую матрицу:

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

Это также известно как декартово произведение. Как я могу это сделать?

Большое спасибо

Ответы [ 2 ]

43 голосов
/ 23 марта 2012

Вот один из способов:

[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
3 голосов
/ 22 октября 2015

Подход, аналогичный описанному @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
...