这个矩阵乘法更一般的或有效的方法?

问题描述 投票:1回答:2

在R,在那里,以产生从下面的两个矩阵所需要的输出的更有效的和/或一般的方式?我怀疑我所做的只是一些深奥的矩阵乘法运算,其中我不知道。

ff <- matrix(1:6,ncol=2)
# [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6

bb <- matrix(7:10,ncol=2)
# [,1] [,2]
# [1,]    7    9
# [2,]    8   10

# DESIRE:
#  7 36
# 14 45
# 21 54
#  8 40
# 16 50
# 24 60

这工作,但不是我要找的通用的解决方案:

rr1 <- t(t(ff) * bb[1,])
rr2 <- t(t(ff) * bb[2,])
rbind(rr1,rr2)
# [,1] [,2]
# [1,]    7   36
# [2,]   14   45
# [3,]   21   54
# [4,]    8   40
# [5,]   16   50
# [6,]   24   60

这下一个代码块似乎很有效,是通用的。但有一个更好的办法?喜欢的东西kronecker(ffa,bba)? (这显然不会在这种情况下工作)

ffa <- matrix(rep(t(ff),2), ncol=2, byrow=T)
bba <- matrix(rep(bb,each=3), ncol=2)
ffa * bba
# [,1] [,2]
# [1,]    7   36
# [2,]   14   45
# [3,]   21   54
# [4,]    8   40
# [5,]   16   50
# [6,]   24   60

这关系到我的其他问题:

  1. Using apply function over the row margin with expectation of stacked results,在那里我试图理解apply本身的行为:
  2. Is this an example of some more general matrix product?,在那里我问的是理论数学,具体。
r linear-algebra matrix-multiplication
2个回答
3
投票

使用直积和摘掉相应的列:

kronecker(bb, ff)[, c(diag(ncol(bb))) == 1]

或使用的Kronecker管道符:

(bb %x% ff)[, c(diag(ncol(bb))) == 1]

另一种方法是将参数转换为数据帧并在它们之间mapply kronecker。在此问题执行计算cbind(bb[, 1] %x% ff[, 1], bb[, 2] %x% ff[, 2])但在更一般的方式,而不诉诸索引的情况下:

mapply(kronecker, as.data.frame(bb), as.data.frame(ff))

或者使用kronecker管道符:

mapply(`%x%`, as.data.frame(bb), as.data.frame(ff))

3
投票

您正在寻找的功能是矩阵封装功能KhatriRao中可用。由于函数是在矩阵,输出是类“dgCMatrix”(稀疏矩阵)的矩阵。您可以通过as.matrix其转换为类“黑客帝国”的一个普通矩阵。

library(Matrix)
as.matrix(KhatriRao(bb, ff))
© www.soinside.com 2019 - 2024. All rights reserved.