【问题标题】:Sliding window on each column of a matrix in R with parallel processingR中矩阵每一列的滑动窗口,并行处理
【发布时间】:2014-08-14 19:49:18
【问题描述】:

我有一个包含 2000 列和 3000 行的大型矩阵。对于每一列,我想做一个滑动窗口,在其中将 15 行相加,然后向下一行并对接下来的 15 行求和,等等......并使用此信息创建一个新矩阵。我有一个可以工作的函数(虽然看起来有点慢)但想并行运行它,因为这是一个更大的脚本的一部分,如果我使用没有并行等效的应用函数,开放集群就会关闭。此外,我必须将整个操作进行 100 次。稍后在脚本中,我使用 parLapply 或 parSapply。

这是我以非并行方式拥有的代码:

# df is a matrix with 2000 columns and 3000 rows, all numeric and no NAs

size <- 15 # size of window
len <- nrow(df) - size + 1 # number of sliding windows to perform 

sumsmatrix <- apply(df, 2, function(x){
      result <- sapply(1:len, function(y){
      sum(x[y:(y+size-1)])
       })
      return(result)
      })

提前致谢。 罗恩

【问题讨论】:

标签: r matrix parallel-processing apply


【解决方案1】:

尝试使用cumsum,您将不必再次将相同的数字相加。

sumsmatrix <- apply(df, 2, function(x)                   
                     cumsum(x)[size:nrow(df)] - c(0,cumsum(x)[1:(len-1)]))

它应该比你正在做的快大约 100 倍。


它是这样工作的:

假设你的x只有5长,你的窗口大小是3,这样更容易。

x <- 1:5
x
# [1] 1 2 3 4 5
cumsum(x)
# [1]  1  3  6 10 15

所以,cumsum(x) 的第三个数字是您想要的第一个总和,但是第四个和第五个数字太大了,因为它们将前几个数字作为窗口的一部分。因此,您只需将两者相减即可。

cumsum(x)[3:5]    
# [1] 6 10 15    
cumsum(x)[1:2]
# [1]    1  3

但是,对于第一个,您需要减去零。

cumsum(x)[3:5]    
# [1] 6 10 15    
c(0,cumsum(x)[1:2])
# [1] 0  1  3

【讨论】:

  • 谢谢。工作得很好而且速度非常快......现在我只需要弄清楚这个功能是如何工作的。
  • @user3770733 如果这回答了您的问题,那么您应该点击绿色复选框接受它。
【解决方案2】:

正如@Andrie 提到的,zoo 包有一些有用的移动窗口函数,例如rollsumrollapply。我不确定你的操作系统是什么,即你正在使用什么并行包,但这里有一个简单的例子:

library(doSNOW)
library(foreach)
library(zoo)
##
oldD <- matrix(
  sample(1:5, (2000*3000), replace=TRUE),
  ncol=2000)
##
cl <- makeCluster(3,"SOCK")
registerDoSNOW(cl)
##
newD <- foreach(j=1:ncol(oldD),
                .combine=cbind,
                .export="rollsum") %dopar% {

                  rollsum(oldD[,j],15)

                }
##
stopCluster(cl)
##

【讨论】:

  • 由于在zoo包中定义了“rollsum”,所以最好使用.packages='zoo'而不是导出它。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 2016-08-16
  • 2013-08-21
  • 2017-03-22
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多