2012-03-23 19 views
13

Ecco la versione semplificata del problema che ho. Supponiamo di avere un vettoreProdotto cartesiano in MATLAB

p = [1 5 10]

e un'altra

q = [. 75 .85 .95].

E voglio venire con la seguente matrice:

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

Questo è anche noto come il prodotto cartesiano. Come posso farlo?

Grazie

+0

In realtà, ho scoperto che http://www.mathworks.com/matlabcentral/fileexchange/5898 questa cosa fa esattamente quello che voglio! – emper

+6

Dovresti metterlo come risposta e accettare la tua risposta per chiudere la domanda. – learnvst

+0

Domanda simile: [Matlab - Genera tutte le combinazioni possibili degli elementi di alcuni vettori] (http://stackoverflow.com/q/4165859/97160) – Amro

risposta

38

Ecco un modo:

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

Il risultato è:

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

Mentre questo è davvero il prodotto cartesiano, non è quello che l'OP chiedeva. Avrebbe bisogno di un passaggio adizionale di 'result = sum (result, 2)' per qualificarsi. – jpjacobs

+3

Non penso sia vero. Se si guarda da vicino, la matrice dei risultati nella domanda dell'OP sembra essere 2 × 9, non 1 × 9. La prima riga è "1, 0,75" (notare lo spazio in "1 .75"), non 1,75. Ciò è ulteriormente confermato dallo script FileExchange collegato che dice che fa esattamente la cosa giusta. Sono d'accordo che è confuso - ho dovuto strizzare gli occhi per vedere cosa stava succedendo! – nibot

+0

Sei completamente corretto su quello. Correggerò il suo post per chiarezza. – jpjacobs

1

Un approccio simile a quello descritto da @nibot possono essere trovati in matlab central file-exchange.

Generalizza la soluzione per qualsiasi numero di set di input. Questa sarebbe una versione semplificata del codice:

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 

Per esempio:

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 
Problemi correlati