两个矩阵的部分乘积

时间:2013-12-17 01:56:11

标签: r matrix

我正在尝试找到一个矢量化技巧来计算两个矩阵的行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]))

2 个答案:

答案 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))