-1

dir1和dir2两个目录共有365个二进制文件,格式相同,byte,extend等...

下面给出的代码将 dir1 和 dir2 作为向量读取,然后计算相关性。基本上我想得到相关图,我们只计算每个网格像素的R值。假设我们要计算 dir1 和 dir2 之间的全局相关图,我们有来自 dir1 和 dir2 的每个像素的两列数据,可以计算该像素的 R 值,然后简单地对全局像素进行循环。

dir1 <- list.files("C:\\cor", "*.bin", full.names = TRUE)
dir2 <- list.files("C:\\cor2", "*.bin", full.names = TRUE)
results <- list()
    for (.files in dir1){
# read in the 365 files as a vector of numbers for dir1
    file1 <- do.call(rbind,(lapply(.files, readBin  , integer() , size = 2 ,
                                n = 360 * 720 , signed = T)))
    }
    for (.files in dir2){
    # read in the 365 files as a vector of numbers for dir2
    file2<- do.call(rbind,(lapply(.files, readBin  , integer() , size = 2 , 
                    n = 360 * 720 , signed = T)))
    }
    # calculate the  correlation so we will get a correlation map
for (.files in seq_along(dir1)){              
    results[[length(results) + 1L]]<- cor(file1 ,file2)
    }

我收到了这个错误:Error in cor(file1, file2) : allocMatrix: too many elements specified

4

2 回答 2

3

如果您想计算每个 x,y 位置的时间相关性(看起来),我会将其读入具有维度的多维数组(nx, ny, ntsteps, ndatasets),例如使用较小的示例数据集:

          # nx   ny   nsteps ndatasets
dat = runif(20 * 30 * 100 *  2)
dim(dat) = c(20, 30, 100, 2)
> str(dat)
num [1:20, 1:30, 1:100, 1:2] 0.969 0.482 0.974 0.682 0.856 ...

现在我们利用了apply也适用于多维数组的事实,而不仅仅是矩阵:

cor_result = apply(dat, c(1,2), function(x) cor(x[,1], x[,2]))
> str(cor_result)
 num [1:20, 1:30] 0.06673 0.00943 -0.11265 -0.01157 -0.0024 ...

我们使用apply迭代所有 x,y 对来计算时间相关性。

对于您的大数据集,加载它大约需要 1.4 Gb。R 中的经验法则是,您需要 3 倍于 RAM 的数据集大小才能使用它。因此,如果您有 8 Gb 的 RAM 和 64 位 R,这应该可以正常工作。或者,我经常分块进行这些计算,因为我只有 4 Gb。例如,您可以先处理前 5 行(y 坐标),然后再处理后 5 行,以此类推。

于 2012-12-03T13:15:02.687 回答
2

我会用以下方式重写你的代码(假设我理解正确并且你想要做的是将每一行file1与每一行进行比较file2):

dir1 <- list.files("C:\\cor", "*.bin", full.names = TRUE)
dir2 <- list.files("C:\\cor2", "*.bin", full.names = TRUE)
file1 <- do.call(rbind,lapply(dir1, readBin  , integer() , size = 2 ,
                                n = 360 * 720 , signed = T))
file2 <- do.call(rbind,lapply(dir2, readBin  , integer() , size = 2 ,
                                n = 360 * 720 , signed = T))
results <- apply(file1, 1, function(x){ apply(file2, 1, function(X){cor(x, X)})})

results将是一个矩阵 (365 x 365),例如 file1 的第 x 行(因此,dir1 中的第 x 文件)和 file2 的第 y 行(因此,dir2 中的第 y 文件)之间的相关系数) 是results[x,y]。然后,您可以直接使用 function 将其绘制为热图image(results)

编辑:澄清代码的最后一行:它完全对应于以下for循环:

results <- array(dim = c(length(file1), length(file2)))
for(i in 1:length(file1)){
    for(j in 1:length(file2)){
        results[i,j]<-cor(file1[i, ], file2[j, ])
        }
    }

根据评论编辑: @PaulHiemstra 比我快,但实际上我正要提出类似的建议:

dir1 <- list.files("C:\\cor", "*.bin", full.names = TRUE)
dir2 <- list.files("C:\\cor2", "*.bin", full.names = TRUE)
file_tot<-array(dim=c(360,720,365,2))
for(i in 1:length(dir1)){
    file_tot[,,i,1] <- readBin(dir1[i], integer(), size = 2 ,n = 360 * 720 , signed = T)
    file_tot[,,i,2] <- readBin(dir2[i], integer(), size = 2 ,n = 360 * 720 , signed = T)
    }
results<-apply(file_tot,c(1,2),function(x){cor(x[,1],x[,2])})
于 2012-12-03T10:38:38.580 回答