"矢量化"矩阵乘法

ran*_*tic 3 r matrix matrix-multiplication

假设我有两个矩阵x和y,两者的尺寸都是100x2.我想创建一个列表,对于x和y的每一行,我有矩阵t(x)%*%y.例如,通过for循环:

x = matrix(rnorm(10), nrow = 5)
y = matrix(rnorm(10), nrow = 5)
myList = list()
for(i in 1:5){
    myList[[i]] = t(x[i, , drop = FALSE]) %*% y[i, ]
}
Run Code Online (Sandbox Code Playgroud)

有更有效的方法来进行此计算吗?我试图找出如何表达矩阵乘法,但没有运气.我也考虑了mapply,但似乎我需要将x和y转换为向量列表而不是矩阵才能使用mapply,而且我怀疑这是正确的方法.

akr*_*run 5

一种方法 Map

Map(function(x,y) matrix(x,ncol=1)%*%y ,
               split(x, row(x)), split(y, row(y))) 
Run Code Online (Sandbox Code Playgroud)

  • 我无法想象这比循环更快,尽管它可能更清晰. (2认同)
  • `Map(tcrossprod,split(x,row(x)),split(y,row(y)))` (2认同)