r语言 - 此矩阵乘法的更通用或更有效的方法



在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. 在行边距上使用应用函数,期望获得堆叠结果,我试图了解apply本身的行为,并且:

  2. 这是一些更通用的矩阵积的例子吗?,我特别问的是理论数学。

使用克罗内克产品并挑选相应的列:

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))

相关内容

  • 没有找到相关文章

最新更新