HOWTO · MATLAB

Zufällige Permutation mit MATLAB

Man kann Vektoren erzeugen, die eine zufällige Permutation von ganzen Zahlen enthalten, indem man die randperm()-Funktion in MATLAB verwendet.

Auf dieser Seite

Die Funktion randperm von MATLAB mischt die Ganzzahlen eines Bereichs und kann eine kleinere Auswahl eindeutiger Indizes liefern, um Daten ohne Zurücklegen zu ziehen. Dieser Leitfaden erklärt beide Varianten und zeigt, wie sich ein Ergebnis durch Speichern und Wiederherstellen des Zustands des Zufallszahlengenerators mit rng reproduzieren lässt.

Was randperm zurückgibt

randperm(n) gibt einen Zeilenvektor zurück, der jede Ganzzahl von 1 bis einschließlich n genau einmal in zufälliger Reihenfolge enthält. Ein Aufruf mit n = 5 liefert beispielsweise eine beliebige Anordnung von 1, 2, 3, 4 und 5; bei einem späteren Aufruf kann die Reihenfolge anders sein. Verwende die zurückgegebenen Zahlen als Indizes, wenn du Elemente eines Arrays umordnen oder daraus eine Stichprobe ziehen möchtest.

Die Funktion gibt ganzzahlige Indizes zurück, keine gemischte Kopie deiner Daten. Um Daten zu mischen, greifst du mit der Permutation auf die Daten zu. Da jeder Index genau einmal vorkommt, werden dabei alle Einträge umgeordnet, ohne etwas auszulassen oder zu duplizieren.

Eine vollständige zufällige Permutation erzeugen

Lege die obere Grenze auf die gewünschte Anzahl von Ganzzahlen fest und rufe dann randperm(n) auf. Dieses Beispiel mit MATLAB verwendet kompatible Syntax; die Reihenfolge wird bei der Ausführung bestimmt, daher ist kein festes Ergebnis angegeben.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

n = 10;
permutation = randperm(n);
disp(permutation);

Das Ergebnis enthält jede Ganzzahl von 1 bis einschließlich 10 genau einmal. Ein weiterer Aufruf kann eine andere Reihenfolge liefern, weil sich der Zustand des Zufallszahlengenerators weiterentwickelt. Für einen Datenvektor liefert data(randperm(numel(data))) eine umsortierte Anordnung seiner Elemente.

Elemente mit randperm(n,k) ohne Zurücklegen auswählen

Verwende randperm(n,k), wenn du k verschiedene Indizes aus dem Bereich von 1 bis n benötigst. Das Ergebnis ist ein Zeilenvektor der Länge k. k darf nicht größer als n sein, denn der Bereich enthält nur n verschiedene Werte. Bei k = n wählt diese Form den gesamten Bereich in zufälliger Reihenfolge aus.

Um Einträge aus einem Vektor auszuwählen, verwende die ausgewählten Indizes direkt. In diesem Beispiel ist die Stichprobe kleiner als die Länge der Daten:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100];
sampleSize = 4;
indices = randperm(numel(data), sampleSize);
sample = data(indices);
disp(sample);

indices enthält vier verschiedene Positionen, und sample enthält die zugehörigen Werte in dieser zufälligen Reihenfolge. Bei dieser Stichprobe wird ohne Zurücklegen gezogen: Ein Index kann nicht zweimal vorkommen, auch wenn der Datenvektor an verschiedenen Positionen gleiche Werte enthalten kann. Bewahre die Indizes auf, wenn du dieselbe Auswahl auch auf zueinander passende Arrays wie Beschriftungen und Beobachtungen anwenden möchtest.

Eine Permutation durch Speichern und Wiederherstellen des Zufallszustands mit rng wiederholen

Ein zufälliges Ergebnis hängt vom Zustand des Zufallszahlengenerators ab. Speichere diesen Zustand vor dem Aufruf und stelle ihn wieder her, bevor du dieselbe Folge von Zufallsoperationen wiederholst. Das Wiederherstellen eines gespeicherten Zustands ermöglicht die Reproduktion der Folge; bei zwei unabhängigen Ausführungen muss der Anfangszustand nicht derselbe sein.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

state = rng;
first = randperm(6);
rng(state);
second = randperm(6);
disp(isequal(first, second));

Der abschließende Ausdruck ist wahr, weil der zweite Aufruf mit dem Zustand beginnt, der beim ersten Aufruf verwendet wurde. Wenn du Ergebnisse über separate Ausführungen hinweg reproduzieren möchtest, initialisiere den Generator vor dem Erzeugen der Permutation mit einem ausdrücklich gewählten Startwert über rng(seed). Die Reproduzierbarkeit hängt davon ab, dass der Zufallszustand wiederhergestellt oder initialisiert wird und die folgenden Zufallsoperationen in derselben Reihenfolge ausgeführt werden.