Was ist der effiziente Weg, um zwei Arrays zu multiplizieren und die Summe der multiplizierten Werte in Ruby zu erhalten?

7

Was ist der effiziente Weg, um zwei Arrays zu multiplizieren und die Summe der Multiplikationswerte in Ruby zu erhalten? Ich habe zwei Arrays in Ruby:

%Vor%

Mein Ziel ist es, den Summenwert von array_A * array_B zu erhalten, d. h. 1 * 3 + 2 * 2 + 1 * 4 + ... + 8 * 5 + 9 * 4.

Weil ich sie in meinen Apps millionenfach berechnen muss, was ist der effizienteste Weg, um solche Berechnungen durchzuführen?

Es ist wie eine Matrixberechnung: 1 * N Matrix * N * 1 Matrix oder ein Vektor-Skalarprodukt.

    
Kevin Hua 10.09.2011, 14:47
quelle

9 Antworten

20

Aktualisieren

Ich habe gerade Benchmarks nach neuen Kommentaren aktualisiert. Nach Joshuas Kommentar , die inject-Methode wird um 25% beschleunigt, siehe array walking without to_a in der Tabelle unten.

Da jedoch die Geschwindigkeit das primäre Ziel für das OP ist, haben wir ein neuer Gewinner für den Wettbewerb , der die Laufzeit von .34 auf .22 in meinen Benchmarks reduziert.

Ich bevorzuge immer noch inject method, weil es rubinischer ist, aber wenn Geschwindigkeit zählt, dann scheint die while-Schleife der richtige Weg zu sein.

Neue Antwort

Sie können immer alle diese Antworten benchmarken, ich habe es aus Neugierde gemacht:

%Vor%

Einfaches Array-Gehen gewinnt, die Matrix-Methode ist schlechter, weil sie die Objekt-Instanziierung enthält. Ich denke, wenn Sie die inject while -Methode schlagen wollen (um hier eine Grössenordnung am schnellsten zu erreichen), müssen Sie eine C -Erweiterung implementieren und sie in Ihrem Ruby-Programm binden .

Hier ist das Skript, das ich benutzt habe

%Vor%     
Fabio 10.09.2011, 16:09
quelle
5

Durch jedes Element zu gehen sollte ein Muss sein

%Vor%     
PeterWong 10.09.2011 15:26
quelle
3

Ich würde einfach anfangen und die Ruby-Matrix-Klasse verwenden:

%Vor%

Wenn dies zu langsam ist, dann tue genau die gleiche Methode, aber mit einer externen Mathematikbibliothek.

    
spike 10.09.2011 15:05
quelle
3

So würde ich es machen

%Vor%     
christianblais 10.09.2011 15:45
quelle
1

Dies ist ein anderer Weg:

%Vor%     
rubyprince 10.09.2011 16:16
quelle
1

Da Geschwindigkeit unser Hauptkriterium ist, werde ich diese Methode gemäß den Benchmarks von Peter als schnellste einreichen.

%Vor%     
Joshua Cheek 10.09.2011 17:36
quelle
1

Probieren Sie den NMatrix Edelstein aus. Es ist eine numerische Berechnungsbibliothek. Ich denke, es verwendet die gleichen C- und C ++ - Bibliotheken, die Octave und Matlab verwenden.

Sie könnten die Matrix-Multiplikation wie folgt machen:

%Vor%

Ich bin nicht sicher, wie die Geschwindigkeit mit reinem Ruby verglichen wird, aber ich stelle mir vor, dass es schneller ist, besonders für große und spärliche Vektoren.

    
Henry Chinner 28.04.2014 06:02
quelle
0
%Vor%     
Assaf Shomer 28.05.2015 10:34
quelle
0

BEARBEITEN: Vektor ist nicht am schnellsten (Marc Bollinger hat völlig Recht).

Hier ist der modifizierte Code mit Vektor und n-mal:

%Vor%

Und die Ergebnisse:

%Vor%

Schade. : (

    
Colin Curtin 03.09.2015 22:49
quelle

Tags und Links