R中矩阵每列滑动窗口的并行处理

R中矩阵每列滑动窗口的并行处理,r,matrix,parallel-processing,apply,R,Matrix,Parallel Processing,Apply,我有一个2000列3000行的大矩阵。对于每一列,我想做一个滑动窗口,在这里我将15行相加,然后向下一行,再将下一行相加,以此类推。。。并用这些信息创建一个新的矩阵。我有一个可以运行的函数(虽然看起来有点慢),但是我想并行运行它,因为这是一个更大的脚本的一部分,如果我使用apply函数而没有并行等价物,那么opencluster将关闭。而且,整个手术我要做100次。在脚本的后面,我使用parlappy或parSapply 以下是我以非并行方式编写的代码: # df is a matrix wit

我有一个2000列3000行的大矩阵。对于每一列,我想做一个滑动窗口,在这里我将15行相加,然后向下一行,再将下一行相加,以此类推。。。并用这些信息创建一个新的矩阵。我有一个可以运行的函数(虽然看起来有点慢),但是我想并行运行它,因为这是一个更大的脚本的一部分,如果我使用apply函数而没有并行等价物,那么opencluster将关闭。而且,整个手术我要做100次。在脚本的后面,我使用parlappy或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)
      })
df是一个矩阵,有2000列和3000行,都是数字,没有NAs
大小尝试使用
cumsum
,您不必再次对相同的数字求和

sumsmatrix <- apply(df, 2, function(x)                   
                     cumsum(x)[size:nrow(df)] - c(0,cumsum(x)[1:(len-1)]))
因此,
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

尝试使用
cumsum
,您将不必再次对相同的数字求和

sumsmatrix <- apply(df, 2, function(x)                   
                     cumsum(x)[size:nrow(df)] - c(0,cumsum(x)[1:(len-1)]))
因此,
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

尝试使用
cumsum
,您将不必再次对相同的数字求和

sumsmatrix <- apply(df, 2, function(x)                   
                     cumsum(x)[size:nrow(df)] - c(0,cumsum(x)[1:(len-1)]))
因此,
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

尝试使用
cumsum
,您将不必再次对相同的数字求和

sumsmatrix <- apply(df, 2, function(x)                   
                     cumsum(x)[size:nrow(df)] - c(0,cumsum(x)[1:(len-1)]))
因此,
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

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

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)
##
库(doSNOW)
图书馆(foreach)
图书馆(动物园)
##

oldD正如@Andrie所提到的,
zoo
包有一些有用的移动窗口函数,例如
rollsum
rollply
。我不确定您的操作系统是什么,即您使用的是什么并行软件包,但这里有一个简单的示例:

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)
##
库(doSNOW)
图书馆(foreach)
图书馆(动物园)
##

oldD正如@Andrie所提到的,
zoo
包有一些有用的移动窗口函数,例如
rollsum
rollply
。我不确定您的操作系统是什么,即您使用的是什么并行软件包,但这里有一个简单的示例:

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)
##
库(doSNOW)
图书馆(foreach)
图书馆(动物园)
##

oldD正如@Andrie所提到的,
zoo
包有一些有用的移动窗口函数,例如
rollsum
rollply
。我不确定您的操作系统是什么,即您使用的是什么并行软件包,但这里有一个简单的示例:

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)
##
库(doSNOW)
图书馆(foreach)
图书馆(动物园)
##

旧的并行化应该是加速代码的最后一件事。第一步,查看package
zoo
中的函数
rollapply
。这个问题可能会有所帮助:并行化应该是加速代码的最后一件事。第一步,查看package
zoo
中的函数
rollapply
。这个问题可能会有所帮助:并行化应该是加速代码的最后一件事。第一步,查看package
zoo
中的函数
rollapply
。这个问题可能会有所帮助:并行化应该是加速代码的最后一件事。第一步,查看package
zoo
中的函数
rollapply
。这个问题可能会有帮助:谢谢。非常好而且非常快。。。现在我只需要弄清楚这个函数到底是如何工作的。@user3770733如果这回答了您的问题,那么您应该通过单击绿色复选框来接受它。谢谢。非常好而且非常快。。。现在我只需要弄清楚这个函数到底是如何工作的。@user3770733如果这回答了您的问题,那么您应该通过单击绿色复选框来接受它。谢谢。非常好而且非常快。。。现在我只需要弄清楚这个函数到底是如何工作的。@user3770733如果这回答了您的问题,那么您应该通过单击绿色复选框来接受它。谢谢。非常好而且非常快。。。现在我只需要弄清楚该函数是如何工作的。@user3770733如果这回答了您的问题,那么您应该通过单击绿色复选框来接受它。由于“rollsum”是在zoo包中定义的,因此最好使用
.packages='zoo'
而不是导出它。由于“rollsum”是在zoo包中定义的,与其导出,不如使用
.packages='zoo'
。因为“rollsum”是在zoo包中定义的,所以使用
.packages='zoo'
比导出它更好。因为“rollsum”是在zoo包中定义的,所以使用
.packages='zoo'
比导出它更好。