-1

dir1 と dir2 の 2 つのディレクトリに 365 個のバイナリ ファイルがあり、同じ形式、バイト、拡張など...

以下のコードは、dir1 と dir2 をベクトルとして読み取り、相関を計算します。相関マップを取得するには、各グリッド ピクセルの R 値を計算するだけです。dir1 と dir2 の間のグローバル相関マップを計算すると仮定すると、各ピクセルに対して dir1 と dir2 からの 2 つの列データがあり、そのピクセルの 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

(nx, ny, ntsteps, ndatasets)各x、y位置の時間相関を(見た目どおりに)計算する場合は、たとえば、より小さなサンプルデータセットを使用して、次元を持つ多次元配列に読み込みます。

          # 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.4Gbかかります。Rの経験則では、データセットを操作するには、RAMの3倍のデータセットサイズが必要です。したがって、たとえば、8 GbのRAMと64ビットのRがある場合、これは正常に機能するはずです。または、4 Gbしかないため、これらの計算をチャンクで行うことがよくあります。たとえば、最初の5行(y座標)を最初に処理してから、次の5行を処理することができます。

于 2012-12-03T13:15:02.687 に答える
2

私はあなたのコードを次のように書き直します(私が正しく理解し、あなたがしたいことはの各行をの各行と比較することであると仮定してfile1file2

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)})})

resultsfile1のx番目の行(したがって、dir1のx番目のファイル)とfile2のy番目の行(したがって、dir2のy番目のファイル)の間の相関係数などの行列(365 x 365)になります。 )はresults[x,y]です。次に、関数を使用してヒートマップとして直接プロットできます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 に答える