我正在尝试找到一个矢量化技巧来计算两个矩阵的行i
和col i
之间的产品,而不会浪费其他产品上的资源(第i行和第j行,我! = j)的
A <- matrix(rnorm(4*5), nrow=4)
B <- matrix(rnorm(5*4), ncol=4)
diag(A %*% B)
是否有此产品的名称,基本R函数或避免for
循环的重塑策略?
for (ii in seq.int(nrow(A)))
print(crossprod(A[ii,], B[,ii]))
答案 0 :(得分:7)
rowSums(A * t(B))
似乎很快:
A <- matrix(rnorm(400*500), nrow=400)
B <- matrix(rnorm(500*400), ncol=400)
bF <- function() diag(A %*% B)
jF <- function() rowSums(A * t(B))
vF <- function() mapply(crossprod, as.data.frame(t(A)), as.data.frame(B))
lF <- function() {
vec <- numeric(nrow(A))
for (ii in seq.int(nrow(A)))
vec[ii] <- crossprod(A[ii,], B[,ii])
vec
}
library(microbenchmark)
microbenchmark(bF(), jF(), vF(), lF(), times = 100)
# Unit: milliseconds
# expr min lq median uq max neval
# bF() 137.828993 183.320782 185.823658 200.747130 207.67997 100
# jF() 4.434627 5.300882 5.341477 5.475393 46.96347 100
# vF() 39.110948 51.071936 54.147338 55.127911 102.17793 100
# lF() 14.029454 18.667055 18.931154 22.166137 65.40562 100
答案 1 :(得分:1)
这个怎么样?
mapply(crossprod, as.data.frame(t(A)), as.data.frame(B))