2015-09-04 3 views
3

У меня есть список матриц разного размера. Как быстро суммировать все элементы в списке матриц?Суммировать список матриц в R

Это мой текущий код, но он довольно медленный. Есть ли более быстрый способ?

for (i in 1: length(w)) { 
    w_sum <- w_sum + sum(apply(w[[i]], 1:2, function (x) x^2)) 
    } 

ответ

7

матрицы являются только векторы под капотом, следовательно, вы можете unlist, квадратные и sum:

sum(unlist(w)^2) 
#[1] 2393 

Используя данные примера @ akrun, в дает тот же результат.

Это гораздо быстрее, если у вас есть тонн матриц:

w <- rep(list(matrix(1:24,nrow=6)), 1e6) 
system.time(sum(unlist(w)^2)) 
# user system elapsed 
# 0.11 0.00 0.10 

system.time(sum(vapply(w, function(x) sum(x^2), numeric(1)))) 
# user system elapsed 
# 2.17 0.00 2.17 

Loops также не должны быть невероятно медленно в этом обстоятельстве в сравнении:

w_sum <- 0 
system.time(for(i in seq_along(w)) { w_sum <- w_sum + sum(w[[i]]^2) }) 
# user system elapsed 
# 2.62 0.00 2.62 
+0

Это были мои результаты, я что-то упускаю? > system.time (replicate (30000, sum (vapply (w, function (x) sum (x^2), числовое (1))))) пользовательская система истекло 1,64 0,38 2,02 > system.time (replicate (30000, сумма (unlist (w)^2))) пользовательская система истекло 2.81 0.41 3.22 – Adam12344

+1

@ Adam12344 - Я не могу воспроизвести эти результаты. Я получаю '0.84' секунд для' vapply' и '0.07' секунд для' unlist' – thelatemail

Смежные вопросы