如何有效地索引和乘以两个矩阵?

时间:2015-04-17 07:26:52

标签: r matrix indexing

我有两个矩阵" A"," B"和一个数据框" C"。他们是

A <- matrix(1:10, nrow = 2) 
colnames(A) <- letters[1:5]

B <- matrix(11:16, nrow = 2)
colnames(B) <- letters[6:8]

C <- data.frame(ix1 = c("a", "d"), ix2 = c("f", "h"))

我想创建一个矢量&#34; vec&#34;长度为2且值为

vec[1] = A[,"a"] %*% B[,"f"]
vec[2] = A[,"d"] %*% B[,"h"]

这可以通过for循环轻松完成,但是当&#34; A&#34;,&#34; B&#34;和&#34; C&#34;增长。如何有效地做到这一点?

2 个答案:

答案 0 :(得分:4)

您可以按照以下方式进行向量化,但我不确定转置A

的成本是多少
(vec <- diag(crossprod(A[, as.character(C$ix1)], B[, as.character(C$ix2)])))
## [1]  35 233

答案 1 :(得分:3)

您可以使用mapply

vec = mapply(function(u,v) A[,u]%*%B[,v], c('a','d'), c('f','h'))

如果您想使用data.frame C

vec = mapply(function(u,v) A[,u]%*%B[,v], as.character(C[,1]), as.character(C[,2]))
#  a   d 
# 35 233

真正重要的是C的行数,AB中的行数可能不是瓶颈:

v1=rnorm(1000000)
v2=rnorm(1000000)

#> system.time(v1%*%v2)
#   user  system elapsed 
#   0.01    0.00    0.02