2016-04-03 13 views
1

Ich führe ein Experiment mit vielen Bedingungen und einer bestimmten Anzahl von Gruppen in jeder Bedingung durch.MATLAB: Erstellen einer Matrix mit allen möglichen Gruppenkombinationen

A. 3 Gruppen
B. 3 Gruppen
C. 2 Gruppen
D. 3 Gruppen
E. 3 Gruppen

I gearbeitet haben, dass es 3 × 3 × 2 × 3 × 3 = 162 mögliche Kombinationen von Gruppen.

Ich möchte eine MATLAB-Matrix mit 162 Zeilen und 5 Spalten erstellen. Das heißt, eine Zeile für jede Kombination und eine Spalte, um den Wert für jede Gruppe anzugeben.

So wäre zum Beispiel die erste Zeile [1 1 1 1 1], was darauf hinweist, dass diese Kombination Gruppe 1 für alle Bedingungen ist. Die zweite Zeile wäre [1 1 1 1 2], was anzeigt, dass es Gruppe 1 für alle Bedingungen außer der letzten Gruppe 2 ist. Die 162. und letzte Zeile wäre [3 3 2 3 3].

M = 1 1 1 1 1 
    1 1 1 1 2 
    ......... 
    3 3 2 3 3 

Was ist der effizienteste Weg, dies zu erreichen? Ich weiß, dass ich eine Schleife verwenden könnte, aber ich bin mir sicher, dass es einen besseren Weg gibt. Ich dachte, vielleicht würde die perms Funktion funktionieren, aber ich kann nicht sehen, wie.

+0

Hallo. Ich denke, die Schleife ist eine gute Idee, um loszulegen. Ich wäre auch interessiert, wenn es eine schnelle Methode gäbe. Hast du den Loop-Ansatz bisher probiert? –

+0

habe ich, und da dies nur in meinem Code erscheint, einmal die Verlangsamung ist nicht wirklich wahrnehmbar. Ich verlange mehr aus der Perspektive, besser zu programmieren, als ein starkes Bedürfnis nach einer Geschwindigkeitsverbesserung zu haben. – user1205197

+0

Ich habe eine Antwort hinzugefügt. ;) –

Antwort

1

können Sie verwenden combvec (letzte Zeile sehen, der Rest ist nur Testdaten zu erzeugen):

% A. 3 groups 
% B. 3 groups 
% C. 2 groups 
% D. 3 groups 
% E. 3 groups 

ngroups = zeros(5, 1); 
ngroups(1) = 3; 
ngroups(2) = 3; 
ngroups(3) = 2; 
ngroups(4) = 3; 
ngroups(5) = 3; 

v = {}; 
for i = 1:length(ngroups) 
    v{i} = 1:ngroups(i) % generate a vector of valid group indices 
end 

% get all possible combinations 
x = combvec(v{:}) 

Da dies eine 5 x 162 double kehren Sie die resultierende Matrix x umsetzen müssen:

x.'