2012-10-28 11 views
5

Ho un vettore A e desidero popolarlo con valori il più uniformemente possibile. Ad esempio, se A è 1x30 e voglio utilizzare tre valori vorrei utilizzare un codice come questo qui sotto:Distribuire uniformemente l'intervallo di valori specificati all'interno di un vettore

% A = zeros(1,30); 
A([1:10])=0; 
A([11:20])=1; 
A([21:30])=2; 

Questo funziona, ma sembra un po 'ingombrante per me. Esiste un modo più elegante di distribuire uniformemente (come possibile) un intervallo di valori specificato all'interno di un vettore? Sono intento a mantenere ognuno dei valori in "ciuffi".

Grazie gentilmente in anticipo.

risposta

2

dire che si desidera distribuire i valori [5 2 6] nel modo più uniforme possibile su un vettore di lunghezza 8. Quindi è possibile utilizzare linspace seguente modo:

vals = [5 2 6]; 
vecLength = 8; 

nVals = length(vals); 
idx = floor(linspace(1,nVals+1-2*eps(nVals),vecLength)); 

out = vals(idx) 

out = 

    5  5  5  2  2  6  6  6 
+0

Jonas, '-2 * eps' sembra non essere sufficiente. Non funziona sul mio esempio. Altrimenti un'idea interessante! – angainor

+0

@angainor: In effetti, dovrebbe essere '2 * eps (nVals)'. Risolto ora. – Jonas

1

vorrei affrontare il problema da un'altra direzione. Definire i valori desiderati, definire il formato vettore, replicare vettore come numero di volte necessario ottenere una matrice, e tagliare gli elementi 'eccessivi':

range = [1 3 5 7 9]'; 
vsize = 52; 

% number of repetitions 
rep = ceil(vsize/numel(range)); 

% replicate the range vector; 
result = repmat(range, 1, rep); 

% cut the the excessive elements 
result(vsize+1:end) = NaN; 
result = reshape(result', 1, []); 
result(isnan(result)) = []; 

La distribuzione è più uniforme possibile, cioè, la la differenza nel numero di occorrenze dei valori dell'intervallo è al massimo 1.

Problemi correlati