Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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 - Fatal编程技术网

R 向量与矩阵的自动乘法

R 向量与矩阵的自动乘法,r,R,我有一个R代码: > coef [1] 1.5 2.4 3.9 4.4 > y [,1] [,2] [,3] [,4] [1,] 1 2 12 45 [2,] 5 6 7 8 [3,] 9 10 2 12 [4,] 13 14 15 45 [5,] 17 18 39 7 我必须将列的每个值乘以相应的coef。结果应该是: First column: 1*1.5 5*1.5

我有一个R代码:

> coef
[1] 1.5 2.4 3.9 4.4
> y
     [,1] [,2] [,3] [,4]
[1,]    1    2   12   45
[2,]    5    6    7    8
[3,]    9   10    2   12
[4,]   13   14   15   45
[5,]   17   18   39    7
我必须将列的每个值乘以相应的coef。结果应该是:

First column:
1*1.5 
5*1.5 
9*1.5 
13*1.5 
17*1.5

Second column: 
2*2.4 
6*2.4 
10*2.4 
14*2.4 
18*2.4

Third column: 
12*3.9 
7*3.9 
2*3.9 
15*3.9 
39*3.9

Fourth column: 
45*4.4
8*4.4
12*4.4 
45*4.4 
7*4.4
所有列的值乘以向量中相同索引处的相同系数

我怎样计算呢

解决办法可以是:

> y[,1] <- y[,1] * coef[1]
> y[,2] <- y[,2] * coef[2]
> y[,3] <- y[,3] * coef[3]
> y[,4] <- y[,4] * coef[4]

>y[,1]y[,2]y[,3]y[,4]这将为您提供您想要的:

t( t(y) * coef  )

还有两种可能性:
sweep
scale
(后者只按列运行,在我看来有点像黑客)

coef延迟输入:

coef[col(y)]*y
在我的系统中,这是最快的

                                      test replications elapsed relative
6                         coef[col(y)] * y        10000   0.068    1.000
5 scale(y, center = FALSE, scale = 1/coef)        10000   0.640    9.412
4                   sweep(y, 2, coef, "*")        10000   0.535    7.868
3                t(apply(y, 1, "*", coef))        10000   0.837   12.309
1                           t(t(y) * coef)        10000   0.176    2.588
2                         y %*% diag(coef)        10000   0.187    2.750

+1很酷,不知道你可以像那样传递运算符。这是一个中缀函数。您只需要提供它的第二个参数就可以让它满意。您不需要转置结果吗?我考虑过这一点,甚至编写了代码,但后来记得
apply
为您转置行操作结果(无论您喜欢与否)。感谢您提供了工作的扫描示例。我确信,
sweep
是可能的答案之一,但无法获得正确的参数。嗨@Frank,我在你对副本的评论中尝试了你的Rcpp代码,但得到了
错误:与'arma::Mat::each_col()[with eT=double]()*=x]中的'operator*='不匹配。我不是Rcpp专家,所以这就是我所得到的。仅供参考,重复问题的链接:
coef[col(y)]*y
                                      test replications elapsed relative
6                         coef[col(y)] * y        10000   0.068    1.000
5 scale(y, center = FALSE, scale = 1/coef)        10000   0.640    9.412
4                   sweep(y, 2, coef, "*")        10000   0.535    7.868
3                t(apply(y, 1, "*", coef))        10000   0.837   12.309
1                           t(t(y) * coef)        10000   0.176    2.588
2                         y %*% diag(coef)        10000   0.187    2.750