2015-11-24 6 views
7

Was ist der beste Weg zum Erstellen einer 10x2-Matrix in Matlab, wo jedes Element ein zufälliges int zwischen 1-5 ist, und so dass es nur eindeutige Paare von Elementen in diesem Array gibt? Ich weiß, dass Randperm mir zufällige eindeutige Zahlen geben kann, aber ich bin nicht sicher, ob es möglich ist, randperm zu verwenden, um eindeutige Paare zu geben? Die einzige andere Möglichkeit, die ich mir vorstellen kann, ist die Verwendung von:MATLAB - Die beste Methode zum Erstellen von 2D-Arrays mit einzigartigen Paaren?

In einer Schleife mit einer if-Anweisung überprüft, ob alle Paare eindeutig sind. Ein Beispiel für die Daten würde ich wäre gerne so etwas wie:

4 5 
1 3 
2 2 
1 4 
3 3 
5 1 
5 5 
2 1 
3 1 
4 3 

Hinweis: Die Reihenfolge der Elemente zum Beispiel spielt keine Rolle, die beide 4, 5 und 5, würde 4 gültig sein.

+3

[ 'nchoosek'] (http://www.mathworks.com/help/matlab/ref/nchoosek.html) – excaza

+0

Obwohl dies ein merkwürdig ist gestellte Frage. Es gibt keine Garantie, dass Sie 10 eindeutige Wertepaare erhalten, wenn Sie zufällig ganze Zahlen zwischen eins und fünf auswählen. Der einzige Weg, dies zu garantieren, ist, wenn Sie einfach '1-5' als Eingabe-Ganzzahlen verwenden. – excaza

+0

Wäre '[1,2; 2,1]' erlaubt? – Daniel

Antwort

5

zuerst alle möglichen Paare als Zeilen einer Matrix erzeugen, dann randperm verwenden, um eine zufällige Teilmenge von Zeilenindizes zu generieren:

N = 5;         %// alphabet size 
M = 2;         %// number of columns 
P = 10;         %// desired number of rows 
allPairs = dec2base(0:N^M-1, N)-'0'+1; %// generate all possible rows 
ind = randperm(size(allPairs,1));   %// indices for random permutation of rows 
ind = ind(1:P);       %// pick P unique indices 
result = allPairs(ind,:);     %// use those indices to select rows 

Beispiel Ergebnis:

result = 
    3  2 
    1  4 
    3  5 
    4  1 
    1  3 
    1  2 
    2  4 
    3  4 
    5  5 
    1  5 
+0

Posted einen anderen basierend auf diesen Funcs, hoffe, das ist in Ordnung :) – Divakar

+0

@Divakar Natürlich! Gut gedacht, effizienter –

1

Basierend auf Kommentar des excaza I gefunden dies für meine Bedürfnisse:

n = randperm(5); 
k = 2; 
data = nchoosek(n, k); 

Die gibt einige Beispielausgabe:

2 3 
2 4 
2 1 
2 5 
3 4 
3 1 
3 5 
4 1 
4 5 
1 5 
+0

Aber das gibt nur eine mögliche Reihenfolge für jedes Paar. Wenn zum Beispiel "1 2" in der Ausgabe vorhanden ist, ist sichergestellt, dass "2 1" niemals sein wird. Außerdem erhalten Sie nie eine Zeile mit zwei gleichen Werten. Insbesondere wird die in Ihrer Antwort angegebene Beispielausgabe niemals auftreten. Entweder ist Ihre Frage nicht gut formuliert, oder diese Antwort ist falsch. Ich denke, es ist diese Antwort, die falsch ist, so tut mir leid, ich bin –

3

Hier ist ein weiterer Ansatz randperm & dec2base ohne die Speicher-Overhead von alle möglichen Reihen zu erzeugen (unter Angabe Luis's solution) -

%// Inputs 
start = 1 
stop = 5 
Nr = 10     %// Number of rows needed 
Nc = 2      %// Number of cols needed 

intv = stop - start + 1;     %// Interval/range of numbers 
rand_ID = randperm(power(intv,Nc)-1,Nr); %// Unique IDs 
out = dec2base(rand_ID,intv) - '0'+ start %// 2D array of unique numbers 

Beispielläufe -

Fall # 1 (gleicher Parameter wie in Frage aufgeführt):

start = 
    1 
stop = 
    5 
Nr = 
    10 
Nc = 
    2 
out = 
    1  3 
    2  1 
    5  3 
    5  4 
    5  5 
    3  4 
    2  3 
    2  5 
    3  3 
    1  4 

Case # 2 (verschiedene Parameter):

start = 
     1025 
stop = 
     1033 
Nr = 
    10 
Nc = 
    5 
out = 
     1030  1029  1033  1028  1029 
     1033  1029  1026  1025  1025 
     1028  1026  1031  1028  1030 
     1028  1031  1027  1028  1025 
     1033  1032  1031  1029  1032 
     1033  1029  1030  1027  1028 
     1031  1025  1032  1027  1025 
     1033  1033  1025  1028  1029 
     1031  1033  1025  1033  1029 
     1028  1025  1027  1028  1032 
+0

Hinweis, dass dec2base funktioniert nur für 2 <= intv <= 36, siehe [dec2base] (http: // de.mathworks.com/help/matlab/ref/dec2base.html). (Wie kann man einen Link in den Kommentaren abkürzen?) –

+0

@FirefoxMetzger ['some_text'] (link) ohne die Leerzeichen. Ja, das ist eine Einschränkung, denke ich, danke für diese Information! – Divakar

Verwandte Themen