我有这个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
Run Code Online (Sandbox Code Playgroud)
我必须将列的每个值乘以相应的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
Run Code Online (Sandbox Code Playgroud)
所有列的值在向量中的相同索引处由相同的系数摩擦.
我怎么做这个计算?
解决方案可能是:
> y[,1] <- y[,1] * coef[1]
> y[,2] <- y[,2] * coef[2]
> y[,3] <- y[,3] * coef[3]
> y[,4] <- y[,4] * coef[4]
Run Code Online (Sandbox Code Playgroud)
但似乎没有太优化!更好的东西?
谢谢!
另外两个可能性:sweep和scale(后者只运行纵列,并在我看来,是有点劈).
coef <- c(1.5,2.4,3.9,4.4)
y <- matrix(c(seq(1,17,by=4),
seq(2,18,by=4),
c(12,7,2,15,39,
45,8,12,45,7)),
ncol=4)
t(t(y)*coef)
t(apply(y,1,"*",coef))
sweep(y,2,coef,"*")
scale(y,center=FALSE,scale=1/coef)
library(rbenchmark)
benchmark(t(t(y)*coef),
y %*% diag(coef),
t(apply(y,1,"*",coef)),
sweep(y,2,coef,"*"),
scale(y,center=FALSE,scale=1/coef),
replications=1e4)
test replications elapsed relative
5 scale(y, center = FALSE, scale = 1/coef) 10000 0.990 4.342105
4 sweep(y, 2, coef, "*") 10000 0.846 3.710526
3 t(apply(y, 1, "*", coef)) 10000 1.537 6.741228
1 t(t(y) * coef) 10000 0.228 1.000000
2 y %*% diag(coef) 10000 0.365 1.600877
Run Code Online (Sandbox Code Playgroud)
编辑:增加了y %*% diag(coef)从@baptiste [不是最快的,但它可能是等了大问题,充分优化的BLAS包...] [,这是最快的另一项试验,所以我可能只是不会有一个稳定的估计]
编辑:在固定错字t(t(y)*coef)[感谢帖木儿Shtatland(但并没有更新定时的,所以他们可能会稍微偏离...)
我也尝试过library(Matrix); y %*% Diagonal(x=coef),这个例子对于这个例子来说非常慢,但是对于一个大矩阵来说可能很快(??).(我也尝试过只构造一次对角矩阵,但是在这个例子中,即使乘以预定矩阵也很慢(比最好的慢25倍,而在动态定义矩阵时慢47倍).
我有一个温和的偏好,sweep因为我认为它最清楚地表达了正在进行的操作("将列与元素相乘coef")
apply(y, 1, "*", coef)
# -- result --
[,1] [,2] [,3] [,4] [,5]
[1,] 1.5 7.5 13.5 19.5 25.5
[2,] 4.8 14.4 24.0 33.6 43.2
[3,] 46.8 27.3 7.8 58.5 152.1
[4,] 198.0 35.2 52.8 198.0 30.8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
937 次 |
| 最近记录: |