Элементарно означает список матриц
Предположим, у вас есть список матриц. Каков наиболее удобный способ вычисления средней матрицы элемента по элементам? Предположим, что у нас есть список матриц:
> A <- matrix(c(1:9), 3, 3)
> A
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> B <- matrix(c(2:10), 3, 3)
> B
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 3 6 9
[3,] 4 7 10
> my.list <- list(A, B)
Таким образом, желаемый результат должен быть:
[,1] [,2] [,3]
[1,] 1.5 4.5 7.5
[2,] 2.5 5.5 8.5
[3,] 3.5 6.5 9.5
Ответы
Ответ 1
Вы можете использовать:
Reduce("+", my.list) / length(my.list)
В соответствии с комментариями вы хотите, чтобы как mean
, так и sd
реализованы в списке матриц, и указанные выше способы не будут работать плавно для sd
. Вместо этого попробуйте:
apply(simplify2array(my.list), 1:2, mean)
apply(simplify2array(my.list), 1:2, sd)
Ответ 2
Вот альтернатива, которая должна быть довольно быстрой, поскольку мы работаем с базовыми функциями, предназначенными для работы с матрицами. Мы просто берем ваш список и используем array
, чтобы превратить его в трехмерный массив, либо используйте apply
, либо просто rowMeans
...
# Make some data, a list of 3 matrices of 4x4
ll <- replicate( 3 , matrix( sample(5,16,repl=TRUE) , 4 ) , simplify = FALSE )
# Make a 3D array from list of matrices
arr <- array( unlist(ll) , c(4,4,3) )
# Get mean of third dimension
apply( arr , 1:2 , mean )
# [,1] [,2] [,3] [,4]
#[1,] 3.000000 3.666667 3.000000 1.666667
#[2,] 2.666667 3.666667 3.333333 3.666667
#[3,] 4.666667 2.000000 1.666667 3.666667
#[4,] 1.333333 4.333333 3.666667 3.000000
Или вы можете использовать rowMeans, который быстрее, указав, что вы хотите получить среднее значение над двумя измерениями...
# Get mean of third dimension
rowMeans( arr , dims = 2 )
# [,1] [,2] [,3] [,4]
#[1,] 3.000000 3.666667 3.000000 1.666667
#[2,] 2.666667 3.666667 3.333333 3.666667
#[3,] 4.666667 2.000000 1.666667 3.666667
#[4,] 1.333333 4.333333 3.666667 3.000000