这种矩阵乘法更通用或更有效的方法?

时间:2019-02-05 16:38:10

标签: r linear-algebra matrix-multiplication

在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?,具体是我在这里询问理论数学。

2 个答案:

答案 0 :(得分:3)

使用克罗内克产品并选择适当的列:

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

或对kronecker使用infix运算符:

(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使用infix运算符:

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

答案 1 :(得分:3)

您要寻找的功能可在Matrix包中作为功能KhatriRao获得。由于该函数位于Matrix中,因此输出为“ dgCMatrix”类的矩阵(稀疏矩阵)。您可以通过as.matrix将其转换为类“ matrix”的普通矩阵。

library(Matrix)
as.matrix(KhatriRao(bb, ff))