2016-05-12 11 views
-2

Angenommen, ich habe eine Folge von n ZahlenWie folgt in Matlab?

e=[5,4,45,63,22,22,1,12,3,2,2,16,14,14,16,17,1,19,21,15,32,32,27,27,43,41,7,8,13,23,23] 

dann zum ersten 10 Zahlen dh

[5,4,45,63,22,22,1,12,3,2] 

Zählnummern außer 1 zu 5 und dann dividieren durch 10, dh

[45,63,22,22,12] 

insgesamt 5 Sollte so Ergebnis 5/10, jetzt sein für die ersten 20 Zahlen

[5,4,45,63,22,22,1,12,3,2,2,16,14,14,16,17,1,19,21,15] 

dann

[45,63,22,22,12,16,14,14,16,17,19,21,15] 

insgesamt also = 13, so 13/20, wie dies für 10, 20, 30, ... bis zu n Zahlen und dann Plot Figur mit x Achsenpunkte 0102030 ... n und y Achse mit 5/10, 13/20, ..., wie diese

ich dieses

for e=10:10:400 
    for u=1:length(e) 
     d=(numel(u)>5) 
     h=d/u 
    end 
end 

versucht zu tun, aber es zeigt, anders.

+2

Verwenden , der Operator ':' und die logische Grundindizierung, dh 'Summe (k) = Summe (e (1: k)> 10)'. Probieren Sie es selbst aus und bearbeiten Sie Ihre Frage, um zu zeigen, dass Sie es selbst versucht haben, bevor Sie nach dem Code – Dan

+0

fragen, bitte zeigen Sie, was Sie versucht haben. – wonko79

+0

Hallo! Gibt es einen Grund, warum Sie diesen speziellen Algorithmus implementieren möchten?Ist es eine Hausaufgabe? – Alfro

Antwort

2

Versuchen diese

e= [5,4,45,63,22,22,1,12,3,2,2,16,14,14,16,17,1,19,21,15,32,32,27,27,43,41,7,8,13,23,23]; 

bins = 10:10:numel(e); 
counts = NaN(1,numel(bins)); %// pre-allocation. I'm pre-allocating with NaN here instead of zeros because 0 is a valid result for an element of counts and thus could make us miss errors should something go wrong 
for k = 1:numel(bins) 
    counts(k) = sum(e(1:bins(k)) > 5)/bins(k); 
end 

plot(bins, counts) %// or you might prefer bar(bins, counts) 

e(1:bins(k)) Hier werden die ersten Elemente der 10e in der ersten Iteration der Schleife, die erste 20 in der zweiten und so weiter sein. sum(... > 10) zählt nur, wie viele Elemente größer als 5 sind. Um zu verstehen, wie das funktioniert, betrachten Sie x = [3 4 5 6 7 8 5 1 2]. Nun gibt x > 5 das logische Array [0 0 0 1 1 1 0 0 0] zurück, so dass sum(x>10) dasselbe ist wie sum([0 0 0 1 1 1 0 0 0]), das ist 3, d. H. Die Anzahl der Elemente in x größer als 5. Jetzt müssen Sie diese Zahl nur in einem anderen Element von counts bei jeder Iteration speichern, daher haben wir counts(k) = ... und nicht counts = ..., da letzteres (dh wie Ihr Code es hat) counts mit der Skalarzählung bei jeder Iteration überschreibt, anstatt einen Vektor zu erzeugen Das zeichnet jede Zählung bei jeder Iteration auf.

In MATLAB Sie oft mit Schleifen abschaffen können, und Sie können auch so in diesem Fall tun: eine `for`-Schleife

counts = cumsum(e > 5)./(1:numel(e)); 
h = counts(10:10:end); 
1

Hoffnung, dies kann Ihnen helfen,

n=30    % this because of the 'e' size 
Lim = 5   % your limit 
Steps = 10   % 

xValues = Steps:Steps:n 
PlotSeries = NaN(size(e,2)/Steps,2) 

for x = 1:1:size(e,2)/Steps 
    PlotSeries(x,:) = [xValues(x),size(e(e(1:xValues(x))>Lim),2)/xValues(x)] 
end 

plot(PlotSeries) 
+0

@Dan ich habe bereits meine Antwort geändert, um die Frage zu passen –