Как я могу умножить список и вектор поэлементно в R? - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу умножить список матриц и вектор, которые имеют одинаковую длину, поэлементно, без использования для цикла .Вот пример того, что я хочу сделать.

set.seed(1111) # To make the result reproducible
a <- list(matrix(1:9, nrow = 3), matrix(rexp(n = 9, rate = 1), nrow = 3))
b <- c(0.5, 1.5)
c <- list()
for(i in 1:2){
  c[[i]]=a[[i]]*b[i]
}

a
[[1]]
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

[[2]]
          [,1]       [,2]      [,3]
[1,] 0.9793649 0.08094869 0.2668127
[2,] 1.4831377 1.50722214 0.1104620
[3,] 0.4776337 6.75746241 0.1140135

c
[[1]]
     [,1] [,2] [,3]
[1,]  0.5  2.0  3.5
[2,]  1.0  2.5  4.0
[3,]  1.5  3.0  4.5

[[2]]
          [,1]      [,2]      [,3]
[1,] 1.4690473  0.121423 0.4002191
[2,] 2.2247065  2.260833 0.1656930
[3,] 0.7164505 10.136194 0.1710202

Чтобы выполнить эту работу без использования цикла для , описанного выше, какую функцию мне следует использовать?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018
Map(`*`, a, b)

или эквивалент

mapply(`*`, a, b, SIMPLIFY = FALSE)
0 голосов
/ 07 сентября 2018

Вы можете легко сделать это без каких-либо циклов, если превратите свой список матриц в трехмерный массив.

library(abind)
a1 <- do.call(abind, c(a, list(along = 3)))
#, , 1
#
#     [,1] [,2] [,3]
#[1,]    1    4    7
#[2,]    2    5    8
#[3,]    3    6    9
#
#, , 2
#
#          [,1]       [,2]      [,3]
#[1,] 0.9793649 0.08094869 0.2668127
#[2,] 1.4831377 1.50722214 0.1104620
#[3,] 0.4776337 6.75746241 0.1140135

#permute first and third dimension before and after multiplication
aperm(aperm(a1, c(3, 2, 1)) * b, c(3, 2, 1))
# , , 1
# 
#      [,1] [,2] [,3]
# [1,]  0.5  2.0  3.5
# [2,]  1.0  2.5  4.0
# [3,]  1.5  3.0  4.5
# 
# , , 2
# 
#           [,1]      [,2]      [,3]
# [1,] 1.4690473  0.121423 0.4002191
# [2,] 2.2247065  2.260833 0.1656930
# [3,] 0.7164505 10.136194 0.1710202
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...