Ich arbeite mit mehrdimensionalen Array sowohl auf R und MATLAB, diese Arrays haben fünf Dimensionen (insgesamt 14,5 M Elemente). Ich muss eine Dimension entfernen, die ein arithmetisches Mittel anwendet, und ich entdeckte einen erstaunlichen Unterschied der Leistungen, die die zwei Software verwenden.Arithmetisches Mittel auf einem mehrdimensionalen Array auf R und MATLAB: drastische Differenz der Leistungen
MATLAB:
>> a = rand([144 73 10 6 23]);
>> tic; b = mean(a,3); toc
Elapsed time is 0.014454 seconds.
R:
> a = array(data = runif(144*73*6*23*10), dim = c(144,73,10,6,23))
> start <- Sys.time(); b = apply(a, c(1,2,4,5), mean); Sys.time() - start
Time difference of 1.229083 mins
Ich weiß, dass anwenden Funktion langsam ist, da so etwas wie eine Allzweck-Funktion ist, aber ich weiß nicht, wie mit diesem Problem beschäftigen weil dieser Leistungsunterschied wirklich eine große Grenze für mich darstellt. Ich habe versucht, nach einer Verallgemeinerung von colMeans/rowMeans Funktionen zu suchen, aber es ist mir nicht gelungen.
EDIT ich eine kleine Probenmatrix zeigen werden:
> dim(a)
[1] 2 4 3
> dput(aa)
structure(c(7, 8, 5, 8, 10, 11, 9, 9, 6, 12, 9, 10, 12, 10, 14,
12, 7, 9, 8, 10, 10, 9, 8, 6), .Dim = c(2L, 4L, 3L))
a_mean = apply(a, c(2,3), mean)
> a_mean
[,1] [,2] [,3]
[1,] 7.5 9.0 8.0
[2,] 6.5 9.5 9.0
[3,] 10.5 11.0 9.5
[4,] 9.0 13.0 7.0
EDIT (2):
ich entdeckte, dass Summenfunktion anwendet und dann durch die Größe des entfernten Dividieren Dimension ist definitiv schneller:
> start <- Sys.time(); aaout = apply(aa, c(1,2,4,5), sum); Sys.time() - start
Time difference of 5.528063 secs
Können Sie reduzieren die Eingabe/gewünschte Ausgabe bewegen eine kleine 3-dimensionale Anordnung für illustrative Zwecke, z eine 3 * 3 * 2 Matrix? –
@Matteodefelice siehe http://StackOverflow.com/Questions/18604406/Why-is-mean-so-Slow vor allem Joshua die Antwort in Bezug auf Präzision. –