2012-10-28 13 views
5

Mam wektor A i chcę wypełnić go wartościami równomiernie, jak to możliwe. Na przykład, jeśli A jest 1x30 i chcę używać trzy wartości chciałbym użyć kodu jak ten poniżej:Równomiernie rozdziela zakres określonych wartości w wektorze

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

To działa, ale wydaje się nieco kłopotliwe dla mnie. Czy istnieje bardziej elegancki sposób na równomierne rozłożenie (w miarę możliwości) określonego zakresu wartości w wektorze? Zamierzam zachować każdą z wartości w "kępach".

Dziękuję z góry bardzo życzliwie.

Odpowiedz

2

Say chcesz rozpowszechniać wartości [5 2 6] możliwie równomiernie na wektorze długości 8. Następnie można użyć linspace następujący sposób:

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" wydaje się niewystarczający. To nie działa na moim przykładzie. W przeciwnym razie świetny pomysł! – angainor

+0

@angainor: Rzeczywiście, powinno to być '2 * eps (nVals)'. Naprawiono teraz. – Jonas

1

Chciałbym podejść do problemu z innej strony. Definiują żądane wartości, określenie wielkości wektorowych, replikację wektora tyle razy, ile potrzeba uzyskania matrycy, i wyciąć „nadmierny” elementy:

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)) = []; 

rozmieszczenie było nawet, jak to możliwe, czyli różnica w liczbie wystąpień wartości z zakresu wynosi co najwyżej 1.

Powiązane problemy