R 向量与矩阵的自动乘法
我有一个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
> 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