Подтвердить что ты не робот

Декартово произведение в MATLAB

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

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].

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

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

4b9b3361

Ответ 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

Ответ 2

Аналогичный подход, подобный описанному @nibot, можно найти в центральном обмене файлами matlab.

Он обобщает решение на любое количество входных множеств. Это будет упрощенная версия кода:

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