如何有效地索引和乘以两个矩阵?
How to index and multiply two matrices efficiently?
我有两个矩阵 "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"))
我想创建一个向量 "vec",长度为 2,值
vec[1] = A[,"a"] %*% B[,"f"]
vec[2] = A[,"d"] %*% B[,"h"]
这可以通过 for
循环轻松完成,但是当 "A"、"B" 和 "C" 的大小增长时,这很耗时。如何高效地做到?
您可以使用 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
的行数,A
和B
的行数可能不是瓶颈:
v1=rnorm(1000000)
v2=rnorm(1000000)
#> system.time(v1%*%v2)
# user system elapsed
# 0.01 0.00 0.02
您可以按如下方式进行矢量化,但我不确定转置的成本如何 A
(vec <- diag(crossprod(A[, as.character(C$ix1)], B[, as.character(C$ix2)])))
## [1] 35 233
我有两个矩阵 "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"))
我想创建一个向量 "vec",长度为 2,值
vec[1] = A[,"a"] %*% B[,"f"]
vec[2] = A[,"d"] %*% B[,"h"]
这可以通过 for
循环轻松完成,但是当 "A"、"B" 和 "C" 的大小增长时,这很耗时。如何高效地做到?
您可以使用 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
的行数,A
和B
的行数可能不是瓶颈:
v1=rnorm(1000000)
v2=rnorm(1000000)
#> system.time(v1%*%v2)
# user system elapsed
# 0.01 0.00 0.02
您可以按如下方式进行矢量化,但我不确定转置的成本如何 A
(vec <- diag(crossprod(A[, as.character(C$ix1)], B[, as.character(C$ix2)])))
## [1] 35 233