我在 R 和 MATLAB 上都使用多维数组,这些数组有五个维度(总共 1450 万个元素)。我必须删除一个对其应用算术平均值的维度,我发现使用这两个软件的性能存在惊人的差异。
MATLAB:
>> a = rand([144 73 10 6 23]);
>> tic; b = mean(a,3); toc
Elapsed time is 0.014454 seconds.
回复:
> 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
我知道 apply 函数很慢,因为它类似于通用函数,但我不知道如何处理这个问题,因为这种性能差异对我来说确实是一个很大的限制。我试图搜索 colMeans/rowMeans 函数的概括,但没有成功。
编辑 我将展示一个小样本矩阵:
> 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
编辑(2):
我发现应用 sum 函数然后除以删除维度的大小肯定更快:
> start <- Sys.time (); aaout = apply(aa, c(1,2,4,5), sum); Sys.time () - start
Time difference of 5.528063 secs