Produto cartesiano em MATLAB

Aqui está a versão simplificada do problema que tenho. Suponha que eu tenho um vector

=[1 5 10]

e outro

Q=[.75 .85 .95].

e quero criar a seguinte matriz:

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

Este também é conhecido como o produto cartesiano. Como posso fazer isso?

Muito obrigado.
Author: jpjacobs, 2012-03-23

2 answers

Aqui está uma maneira:
[X,Y] = meshgrid(p,q);
result = [X(:) Y(:)];

A saída é:

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
 39
Author: nibot, 2012-03-23 09:11:08

Uma abordagem semelhante à descrita por @nibot pode ser encontrada em matlab central file-exchange .

Generaliza a solução a qualquer número de conjuntos de entrada. Esta seria uma versão simplificada do Código:

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

Por exemplo:

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
 2
Author: jruizaranguren, 2015-10-22 14:26:27