2015-11-24 5 views
7

Qual è il modo migliore per creare una matrice 10x2 in MATLAB in cui ogni elemento è un intervallo casuale compreso tra 1 e 5, in modo che ci siano solo coppie di elementi univoche in questo array? So che randperm può darmi numeri univoci casuali, ma non sono sicuro che sia possibile usare randperm per dare coppie uniche? L'unico altro modo posso pensare a sta usando:MATLAB - Il modo migliore per creare un array 2d di coppie uniche?

randi([1 5], 10, 2); 

In un ciclo con un'istruzione if controllando se tutte le coppie sono unici. Un esempio dei dati mi piacerebbe sarebbe qualcosa di simile:

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

Nota: l'ordine degli elementi non importa per esempio, entrambi a 4, 5 e 5, 4 sarebbe valida.

+3

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

+0

se questo è un curiosamente domanda posta Non vi è alcuna garanzia che otterrete 10 coppie di valori unici se si selezionano in modo casuale numeri interi compresi tra uno e cinque. L'unico modo per garantirlo è se utilizzi '1-5' come valori di input. – excaza

+0

Sarebbe '[1,2; 2,1]' permesso? – Daniel

risposta

5

Prima generare tutte le possibili coppie come righe di una matrice, quindi utilizzare randperm per generare un sottoinsieme casuale di indici riga: risultato

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 

Esempio:

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

Ne ho pubblicato un altro basato su quelle funzioni, spero che vada bene :) – Divakar

+0

@Divakar Naturalmente! Ben pensato, più efficiente –

1

Basato sul commento di excaza ho trovato questo per soddisfare le mie esigenze:

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

Quale fornisce un esempio di output:

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

Ma questo dà solo un possibile ordine per ogni coppia. Ad esempio, se '1 2' è presente nell'output, è assicurato che' 2 1' non sarà mai. Inoltre, non otterrai mai una riga con due valori uguali. In particolare, l'output di esempio fornito nella risposta non si verificherà mai. O la tua domanda non è ben formulata, o questa risposta è sbagliata. Penso che sia questa risposta che è sbagliata, mi dispiace, sto downvoting –

3

Ecco un altro approccio con randperm & dec2base senza il sovraccarico della memoria di generare tutte le possibili righe (citando 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 

esempio esegue -

Caso # 1 (stessi parametri come elencato nella domanda):

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 

Caso # 2 (parametri differenti):

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

nota che dec2base funzionerà solo per 2 <= intv <= 36, vedi [dec2base] (http: // de.mathworks.com/help/matlab/ref/dec2base.html). (Come si può abbreviare un collegamento nei commenti?) –

+0

@FirefoxMetzger ['some_text'] (collegamento) senza spazi. Sì, questa è una limitazione qui, immagino, grazie per queste informazioni! – Divakar