2012-11-08 25 views
7

我需要矩阵的每一列的加权总和。最快的方法来获取矩阵的列的加权总和R

data <- matrix(1:2e7,1e7,2) # warning large number, will eat up >100 megs of memory 
weights <- 1:1e7/1e5 
system.time(colSums(data*weights)) 
system.time(apply(data,2,function(x) sum(x*weights))) 
all.equal(colSums(data*weights), apply(data,2,function(x) sum(x*weights))) 

通常colSums(data*weights)比应用调用更快。

我经常做这个操作(在一个大矩阵上)。因此寻找最有效实施的建议。理想情况下,如果我们可以将权重传递给colSums(或rowSums),那会非常好。

谢谢,感谢任何见解!

回答

8

colSums*都是内或基本功能,并会比apply方法快得多

你可以尝试另一种方法是使用一些基本的矩阵代数,你正在寻找

weights %*% data 

矩阵乘法方法看起来并不快,但它可以避免创建一个大小为data

system.time({.y <- colSums(data * weights)}) 
## user system elapsed 
## 0.12 0.03 0.16 


system.time({.x <- weights %*% data}) 
## user system elapsed 
## 0.20 0.05 0.25 
+0

谢谢,有道理。 – Anirban

3

Rcpp导致性能提升(特别是对于较大数量的列)。

library(Rcpp) 
library(inline) 
src <- ' 
Rcpp::NumericMatrix dataR(data); 
Rcpp::NumericVector weightsR(weights); 
int ncol = dataR.ncol(); 
Rcpp::NumericVector sumR(ncol); 
for (int col = 0; col<ncol; col++){ 
    sumR[col] = Rcpp::sum(dataR(_, col)*weightsR); 
} 
return Rcpp::wrap(sumR);' 

weighted.colSums <- cxxfunction(
    signature(data="numeric", weights="numeric"), src, plugin="Rcpp") 
data <- matrix(as.numeric(1:1e7),1e5,100) # warning large object 
weights <- 1:1e5/1e5 
all.equal(colSums(data*weights), weighted.colSums(data, weights)) 
## [1] TRUE 
print(system.time(colSums(data*weights))) 
## user system elapsed 
## 0.065 0.001 0.064 
print(system.time(as.vector(weighted.colSums(data, weights)))) 
## user system elapsed 
## 0.019 0.001 0.019 
all.equal(as.vector(weights %*% data), weighted.colSums(data, weights)) 
## [1] TRUE 
print(system.time(weights %*% data)) 
## user system elapsed 
## 0.066 0.001 0.066 
相关问题