在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))
您正在寻找的功能在 Matrix 包中作为函数 KhatriRao 提供。由于该函数在矩阵中,因此输出是类"dgCMatrix"(稀疏矩阵(的矩阵。您可以通过as.matrix将其转换为类"matrix"的普通矩阵。
library(Matrix)
as.matrix(KhatriRao(bb, ff))