在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
这与我的其他问题有关:
Using apply function over the row margin with expectation of stacked results,在这里我试图了解apply
本身和以下行为的行为:
Is this an example of some more general matrix product?,具体是我在这里询问理论数学。
答案 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))