R行乘法-重新设置样式?
如果我有,比方说,一个(批次x 5)矩阵和一个(1 x 5)矩阵,有没有更好的方法将它们按行相乘:R行乘法-重新设置样式?,r,matrix,R,Matrix,如果我有,比方说,一个(批次x 5)矩阵和一个(1 x 5)矩阵,有没有更好的方法将它们按行相乘: > q [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 > z [,1] [,2] [,3] [,4] [,5] [1,] 1 6 11 16 21 [2,] 2 7 12 17 22 [3,] 3 8 13 18 23 [4,]
> q
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
> z
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
> t(apply(z,1,function (x) {x*q}))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 12 33 64 105
[2,] 2 14 36 68 110
[3,] 3 16 39 72 115
[4,] 4 18 42 76 120
[5,] 5 20 45 80 125
这是可行的,但似乎很糟糕。有我缺少的功能吗?您可以试试
z*q[col(z)]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 12 33 64 105
#[2,] 2 14 36 68 110
#[3,] 3 16 39 72 115
#[4,] 4 18 42 76 120
#[5,] 5 20 45 80 125
或
或
基准
z另一个选项是sweep
sweep(z, 2, q, "*")
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 12 33 64 105
# [2,] 2 14 36 68 110
# [3,] 3 16 39 72 115
# [4,] 4 18 42 76 120
# [5,] 5 20 45 80 125
后一种解决方案似乎很聪明。@RichardScriven谢谢,它可能是。我将使用rep.int
再次运行它,看看是否会发生变化。@RichardScribenrep.int
的问题在于它没有每个
参数。也许我以后需要整理一下。我不知道这是否值得我为我只有一张支票而感到遗憾;阿克伦想出了这样一个聪明的解决办法。这两种解决方案都将我的运行时间从~10m缩短到~1m。
z*rep(q,each=ncol(z))
z <- matrix(1:5e6,ncol=5)
f1 <- function() {sweep(z, 2, q, "*")}
f2 <- function() {z*q[col(z)]}
f3 <- function() {z*rep(q,each=ncol(z))}
library(microbenchmark)
microbenchmark(f1(), f2(),f3(), unit='relative', times=40L)
# Unit: relative
#expr min lq mean median uq max neval cld
#f1() 4.411211 4.407288 4.370018 4.308901 4.825270 2.396968 40 c
#f2() 2.607341 2.668707 2.916354 3.323934 3.321174 1.437837 40 b
#f3() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 40 a
sweep(z, 2, q, "*")
# [,1] [,2] [,3] [,4] [,5]
# [1,] 1 12 33 64 105
# [2,] 2 14 36 68 110
# [3,] 3 16 39 72 115
# [4,] 4 18 42 76 120
# [5,] 5 20 45 80 125