2009-12-06 2 views
10

Io uso questo codice per creare e tracciare N punti:Come seleziono a caso k punti da N punti in MATLAB?

N=input('No. of Nodes:'); 
data = rand(N,2) % Randomly generated n no. of nodes 
x = data(:,1); 
y = data(:,2); 
plot(x,y,'*'); 

Come selezionare k punti (con probabilità p=0.25) di N punti, poi il colore quei k punti rosso e lasciare gli altri punti come *.

+1

L'ultima dichiarazione è in conflitto con se stessa. Vuoi scegliere a caso i valori di 'k' dai valori di' N', o vuoi prelevare i valori casualmente da un vettore di lunghezza 'N' con una probabilità' p'? Questi due approcci possono avere risultati diversi. – gnovice

risposta

27

Ci sono due approcci che è possibile adottare. La prima soluzione consiste nel selezionare in modo casuale i valori k dai valori N, i quali assicureranno che l'utente abbia sempre puntipunti scelti. La seconda soluzione consiste nel selezionare i valori in modo casuale con ognuno con una probabilità media di scegliere p, che potrebbe comportare un minimo di 0 o fino a N scelti a caso.

  • Picking k da N valori:

    È possibile utilizzare la funzione RANDPERM per creare una permutazione casuale di interi 1 attraverso N, poi scegliere i primi k valori nell'elenco permutato e li rappresenterà nuovamente come rosso:

    index = randperm(N); 
    plot(x(index(1:k)),y(index(1:k)),'r*'); 
    
  • valori Prelievo con una probabilità media p:

    È possibile utilizzare la funzione di RAND di scegliere un valore casuale 0-1 per ciascuno dei tuoi N valori, quindi scegliere quelli con un valore casuale minore o uguale al tuo probabilità media p e li rappresenterà nuovamente il rosso:

    index = (rand(N,1) <= p); 
    plot(x(index),y(index),'r*'); 
    
+0

grazie mille, la seconda risposta è perfetta per me. – gurwinder

+0

o utilizzare ['randsample'] (http://www.mathworks.com/help/toolbox/stats/randsample.html) per il primo caso. – chaohuang

3

da quello che ho capito, per ciascuno del punto casuale N si vuole lanciare una moneta per decidere se a SEL ect o no (in cui la moneta ha un p=0.25 probabilità di successo!)

data = rand(N,2);    %# generate random points 
index = (rand(N,1) <= p);  %# roll coins to pick with prob p 
data(~index, :) = [];   %# keep only selected points 

Questo finisce per essere equivalente a generare solo p*N punti casuali, in primo luogo (almeno ci si avvicina a questo numero come N cresce più grande) ...

data = rand(p*N, 2);   %# directly generate p*N number of points 


si può verificare che l'ultima affermazione per diversi valori di N:

fprintf('1st = %d \n', p*N) 
fprintf('2nd = %d \n', sum(rand(N,1) <= p)) 
+0

grazie, ho anche bisogno di quei k punti scelti, come hai detto dati (~ index,:) = []; grazie di aiuto – gurwinder

+0

se dobbiamo trovare la distanza tra qualsiasi punto di dati = rand (N, 2) (diciamo prima) da qualsiasi punto di dati (~ index, :) = []; (diciamo prima di tutto anche), come possiamo usare i dati (~ index, :) = []; matrice nella seguente dichiarazione? dist = sqrt ((data (1,1) -data (~ indice, 1))^2+ (dati (1,2) -data (~ indice, 2))^2). la mia domanda è come stiamo prendendo il primo elemento di dati come dati (1,1) e dati (1,2). come prendiamo il primo elemento di dati (~ index, :) matrix? – gurwinder

+0

Non sono sicuro di aver capito la domanda, ma so che 'data (~ index,:) = []' rimuove semplicemente tutti gli elementi non selezionati. Quindi se pianifichi di utilizzare sia i punti selezionati che quelli non selezionati, devi NON rimuoverli, ma puoi forse memorizzarli in due matrici differenti: 'selected = data (index, :);' e 'not_selected = data (~ index, :); '. Quindi se vuoi calcolare la distanza tra due punti 'i' e' j' ciascuno da un set, usa: 'dist_ij = sqrt (sum ((selezionato (i,:) - not_selected (j,:)).^2)); ' – Amro