2016-03-21 15 views
0

Nehmen wir an, ich habe einen Vektor mit dem Namen vect = [1 2 3 4 5 6 7 8 9] und einen anderen Vektor mit dem Namen intervals = [1 3 6 9]. Ist es möglich, einen weiteren Vektor von Teilsummen von Elementen in vest mit intervals zu erhalten? Ich möchte so etwas wie dies zu tun:Summe der Elemente in einem Vektor mit Intervallen

Teilsumme 1 = 1 + 2 + 3 (Elemente aus vect(1) zu vect(3))

Teilsumme 2 = 4 + 5 + 6 (Elemente aus vect(3 + 1) zu vect(6))

Teilsumme 3 = 7 + 8 + 9 (Elemente aus vect(6 + 1) zu vect(9))

Also, was soll ich tun, ist die Summe der ersten k Elemente zu erhalten, dann die Summe von weiteren k Elementen starti ng von der ersten nicht in der vorherigen Summe usw.

Original-Problem: war das ursprüngliche Problem wie folgt aus: Ich erhalte einen Vektor mit n Werten und einem Wert k. Lass uns t = max(v)/k Intervalle machen. Wie viele Werte von n liegen nun im Intervall [0, t]? Was ist mit [t, t * 2)? Was ist mit [2 * t, 3 * t)? usw. Bisher habe ich accumarray(v, 1) verwendet, um herauszufinden, wie viele Werte ich habe und int = (0:max(v)/k:max(v)), um den Vektor der Invervale zu erstellen, aber jetzt muss ich sum(accumarray(v, 1)) in einer Weise, um diese Teilsummen zu erhalten.

Wenn Sie testen wollen, dies mit (http://pastebin.com/jCZ3qYhz: erzeugt mit accumarray) und k = 16, die Teilsummen müssen sein: 157, 167, 136, 251, 726, 1300, 1152..I'd gerne sein in der Lage, dies ohne eine for/while-Schleife zu tun :) Vektorisierung ist der Schlüssel!

Edit: Um meine erste Summe zu erhalten, verwende ich diese: sum(accumarray(v, 1)(1:16)), für die zweite: sum(accumarray(v, 1)(17:32)), aber ich weiß nicht, wie diese Operation vektorisieren. Ich habe das versucht: i = (1:16:500). Dann sum(accumarray(v, 1)(i(1:length(i)) : i(2:length(i))) aber es funktioniert nicht wirklich oder ich benutze nicht das Richtige.

+0

Übrigens habe ich eine andere Frage. Ich habe jetzt einen großen Vektor mit Dezimalzahlen und wie bisher einige Grenzen. Wie kann ich zählen, wie viele Werte in jedem Intervall enthalten sind? Acumarray scheint nicht mit Dezimalzahlen zu arbeiten, sondern nur mit positiven ganzen Zahlen. – Adi

Antwort

1

Für das erste Problem würde ich diese verwenden:

cs = cumsum(vect); 
i2 = intervals(2:end); 
result = [cs(i2(1)), diff(cs(i2))] 

result = 

    6 15 24 

Dies wird die cumulative sum aller Elemente bauen, um die Enden der Teile, und dann die Unterschiede zwischen den Summen am Ende der Teile finden (das sind genau die Summen der Elemente dazwischen).

+0

Danke! Ich habe den Code angepasst und es funktioniert großartig. Ich wusste nicht über die Diff-Funktion. Einen schönen Tag noch! – Adi

+0

Übrigens habe ich eine andere Frage. Ich habe jetzt einen großen Vektor mit Dezimalzahlen und wie zuvor einige Intervalle. Wie kann ich zählen, wie viele Werte in jedem Intervall enthalten sind? Acumarray scheint nicht mit Dezimalzahlen zu arbeiten, sondern nur mit positiven ganzen Zahlen. – Adi

+1

@Adi Sie könnten 'arrayfun' mit' find' verwenden, um das letzte Element von 'intervals' zu finden, das streng kleiner als' x' ist, für alle in 'vect', dann' accumarray' zum Zählen. – zeeMonkeez

Verwandte Themen