Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R行乘法-重新设置样式?_R_Matrix - Fatal编程技术网

R行乘法-重新设置样式?

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,]

如果我有,比方说,一个(批次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,]    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
再次运行它,看看是否会发生变化。@RichardScriben
rep.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