Tôi đang làm việc với mảng đa chiều cả trên R và MATLAB, các mảng này có năm chiều (tổng số 14,5 triệu phần tử). Tôi phải loại bỏ một kích thước áp dụng một trung bình số học trên nó và tôi phát hiện ra một sự khác biệt tuyệt vời của buổi biểu diễn bằng cách sử dụng hai phần mềm.Số học trung bình trên một mảng đa chiều trên R và MATLAB: sự khác biệt quyết liệt của biểu diễn
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
Tôi biết rằng áp dụng chức năng là chậm vì là một cái gì đó giống như một chức năng mục đích chung, nhưng tôi không biết làm thế nào để đối phó với vấn đề này bởi vì sự khác biệt về buổi biểu diễn này thực sự là một giới hạn lớn đối với tôi. Tôi đã cố gắng để tìm kiếm một generalisation của colMeans/rowMeans chức năng nhưng tôi đã không thành công.
EDIT tôi sẽ hiển thị một ma trận mẫu nhỏ:
> 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):
tôi phát hiện ra rằng việc áp dụng chức năng tổng hợp và sau đó chia cho kích thước của loại bỏ kích thước chắc chắn nhanh hơn:
> start <- Sys.time(); aaout = apply(aa, c(1,2,4,5), sum); Sys.time() - start
Time difference of 5.528063 secs
Bạn có thể làm giảm đầu vào/đầu ra mong muốn một mảng 3 chiều nhỏ cho mục đích minh họa, ví dụ ma trận 3 * 3 * 2? –
@Matteodefelice xem http://stackoverflow.com/questions/18604406/why-is-mean-so-slow đặc biệt là câu trả lời của Joshua về độ chính xác. –