2012-03-23 49 views
13

Aquí está la versión simplificada del problema que tengo. Supongamos que tengo un vectorProducto cartesiano en MATLAB

p = [1 5 10]

y otro

q = [. 75 0,85 0,95].

Y quiero llegar a la siguiente matriz:

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

Esto también se conoce como el producto cartesiano. ¿Cómo puedo hacer eso?

Muchas gracias

+0

En realidad, he encontrado que http://www.mathworks.com/matlabcentral/fileexchange/5898 esto hace exactamente ¡lo que quiero! – emper

+6

Debe poner eso como una respuesta y aceptar su propia respuesta para cerrar la pregunta. – learnvst

+0

Pregunta similar: [Matlab - Genera todas las combinaciones posibles de los elementos de algunos vectores] (http://stackoverflow.com/q/4165859/97160) – Amro

Respuesta

38

He aquí una manera:

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

La salida es:

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 
+0

Si bien este es el producto cartesiano, no es lo que solicitó el OP. Necesitaría un paso adicional de 'resultado = suma (resultado, 2)' para calificar. – jpjacobs

+3

No creo que sea cierto. Si miras de cerca, la matriz de resultados en la pregunta del OP parece ser 2 × 9, no 1 × 9. La primera fila es "1, 0.75" (tenga en cuenta el espacio en "1 .75"), no 1.75. Esto se ve confirmado por el script FileExchange vinculado que dice que hace exactamente lo correcto. Estoy de acuerdo en que es confuso, ¡tuve que entrecerrar los ojos para ver qué estaba pasando! – nibot

+0

Tiene toda la razón en eso. Corregiré su publicación para mayor claridad. – jpjacobs

1

Un enfoque similar a la descrita por @nibot se pueden encontrar en matlab central file-exchange.

Se generaliza la solución a cualquier cantidad de conjuntos de entrada. Esta sería una versión simplificada del 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 ejemplo:

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 
Cuestiones relacionadas