2012-04-12 5 views
1

Können sagen, wir haben folgende Vektor:Eine Kombination aus Hist und Summe: Gibt es dafür eine Funktion?

data=a=[2.3 3.2 4.1 6.2 7.3 6.4 5.5 4.3 3.2 2.6 1.7 3.4 4.5 5.7 6.8]; 

Wenn wir die Zahlen nur mit der hist-Funktion zählen, erhalten wir so etwas wie das:

[n xout]=hist(a,[1:1:max(a)]) 

n = 

0  0  2  4  3  1  3  2 

xout =

0  1  2  3  4  5  6  7 

Was ich jetzt machen möchte, ist jedes Element eines Behälters zu summieren:

xout =

0  1  2  3  4  5  6  7 

n =

0  0  2  4  3  1  3  2 

binsum =

0  0  4 12.4 etc. 

für den dritten Behälter haben beispielsweise n i (3) = 2-Werte, die zwischen 1,5 und 2 , 5 (Größe eines Fachs): 1,7 und 2,3 -> 1,7 + 2,3 = 4 -> Binsum (3) = 4 für den vierten Fach habe ich n (4) = 4 Werte, die zwischen 2,5 und 3 sind, 5: 3,2 + 3,2 + 3,4 + 2,6 = 12,4-> Binsum (4) = 12,4 usw.

Gibt es eine einfache Funktion, die diese Aufgabe erledigen?

Antwort

2

Wenn Ihr Histogramm-Bins durch das Array minBin:binWidth:maxBin definiert ist, dann können Sie die Indizes des Bins, finden und dann die Daten wie folgt zusammenfassen:

minBin = 1; 
binWidth = 1; 
maxBin = 7; 

data=[2.3 3.2 4.1 6.2 7.3 6.4 5.5 4.3 3.2 2.6 1.7 3.4 4.5 5.7 6.8]; 

%# to create index: First, take care of out-of-range data points 
tmp = max(min(data, maxBin),minBin); 
%# then, subtract minimum, divide by step, round: this is the binIdx 
%# add 1 so that we don't start counting at 0 
idx = round((tmp-minBin)/binWidth) +1; 

%# now we can use accumarray to sum up the data 
binSum = accumarray(idx(:),data(:),[floor((maxBin-minBin)/binWidth)+1, 1], @sum, 0) 

binSum = 

     0 
    4.0000 
    12.4000 
    8.4000 
    4.5000 
    23.8000 
    14.1000 

Bitte beachte, dass ich nicht zwei Nullen erhalte Erstens, weil ich die Bins benutze, die Sie als hist eingegeben haben, nicht die, die Sie anscheinend zum Generieren der Ausgaben verwendet haben. Sie können die Anzahl auch ermitteln, indem Sie data durch ones(length(data),1) ersetzen.

Verwandte Themen