在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
这关系到我的其他问题:
apply
本身的行为:使用直积和摘掉相应的列:
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))
您正在寻找的功能是矩阵封装功能KhatriRao中可用。由于函数是在矩阵,输出是类“dgCMatrix”(稀疏矩阵)的矩阵。您可以通过as.matrix其转换为类“黑客帝国”的一个普通矩阵。
library(Matrix)
as.matrix(KhatriRao(bb, ff))