Bedingte Summe in Array

7

Ich habe zwei Arrays, A und B. Ich möchte ein neues Array C mit derselben Dimension wie B bilden, wobei jedes Element SUM (A) für A & gt; B

Unten ist mein Arbeitscode

%Vor%

Wenn A jedoch Millionen von Zeilen hat und B tausende hat, und ich ähnliche Berechnungen für 20 Array-Paare durchführen muss, dauert es wahnsinnig viel Zeit.

Gibt es einen schnelleren Weg?

Zum Beispiel ist Histounts ziemlich schnell, aber es zählt, anstatt zu summieren.

Danke

    
abdfahim 19.07.2015, 23:16
quelle

3 Antworten

5

Sie hatten die richtigen Ideen mit histcounts , da Sie bestimmte A Elemente basierend auf binning im Grunde "akkumulieren". Diese Binning-Operation könnte mit histc durchgeführt werden. In diesem Beitrag wird eine Lösung aufgeführt, die mit ähnlichen Schritten wie in @David's answer beginnt und dann histc verwendet bin und summiere selektive Elemente von A , um uns die gewünschte Ausgabe und alles vektorisiert zu erhalten. Hier ist die Implementierung -

%Vor%

Denken Sie auch daran, wenn Sie das Ergebnis dieser Methode mit dem aus der ursprünglichen for-loop-Version vergleichen, dass es leichte Abweichungen in der Ausgabe geben würde, da diese vektorisierte Lösung cumsum verwendet, was eine laufende Summierung berechnet große kumulativ summierte Zahlen werden zu einzelnen Elementen hinzugefügt, die vergleichsweise sehr klein sind, während die For-Loop-Version würde nur selektive Elemente summieren. Also, floating-precision issues würde da hoch kommen.

    
Divakar 20.07.2015, 06:09
quelle
7

Abhängig von der Größe Ihrer Arrays (und Ihren Speicherbeschränkungen) ist der folgende Code möglicherweise etwas schneller:

%Vor%

Obwohl es vektorisiert ist, scheint es (vielleicht) durch die Zuweisung von Speicher (Engpässe) zu sein. Ich suche nach einer weiteren Beschleunigung. Abhängig von der Größe Ihres Eingabevektors habe ich bei großen Vektoren bis zu Faktor 2 schneller gemacht.

    
GJStein 20.07.2015 00:41
quelle
6

Hier ist eine Methode, die ein bisschen schneller ist, aber ich bin sicher, es gibt einen besseren Weg, um dieses Problem zu lösen.

%Vor%

Nach einigen sehr harten Tests scheint dies etwas besser zu laufen als doppelt so schnell wie die ursprüngliche Methode.

    
David 20.07.2015 00:40
quelle

Tags und Links