1

R で大きなマトリックス (8,000 x 8,000) をラスター イメージとしてプロットしようとしています。残念ながら、これには 32 ビット OS のメモリが多すぎるため、データを 2 つの (4000 x 8000) イメージとしてプロットしています。それらを再結合します。

多くのパッケージを見てきましたが、適切な機能が見つかりませんでした。画像が S4 オブジェクトとしてインポートされ、色が配列に格納されていることはわかっていますが、それらを組み合わせる方法があるはずですが、わかりません。Rでこれを行う方法を知っている人はいますか? ありがとう

編集:

データは 8000 個の csv ファイルに保存され、file1 はマトリックスの 1 行目に対応し、file2 は 2 行目に対応します...

サンプルコード

# get the name of each matrix-row file
# each file is a vector of length 8000, each filei corresponding to matrix row i 

a <- list.files()

for(i in 1:4000){

     # read the data into R, and combine it with the other rows

     matrixRow <- read.table(a[i])
     matrixToPlot <- rbind(matrixToPlot, matrixRow)   

 }


 png("test", 4000, 4000)
     rasterImage(as.raster(matrixToPlot))
 graphics.off()
 ## identical code for matrix-row 4001, 4002, ...8000
4

2 に答える 2

1

マトリックスを縮小してみてください。本当にその詳細が必要ですか?このようにインクリメンタルrbindを実行すると、パフォーマンスが低下し、そのプロットが機能しなくなります。rasterImageには既存のプロットを設定する必要があります。あなたの本当の目標を念頭に置いて尋ねてみてください、これは先に進むための良い方法ではありません。

于 2012-08-07T09:53:03.333 に答える
1

システムモニターのメモリを確認しながら次のことを試しましたが、常に3Gb未満のままです。

    A <- matrix(rnorm(8000*8000),ncol = 8000)
    print(object.size(A),units = "Mb") # 488.3 Mb
    gc() # remove wasted mem (something I don't fully understand)

    # open a plot of appropriate dimensions- scale to your case
    plot(NULL, type = "n", xlim = c(0, 8001), ylim = c(0, 8000))
    # add chunks of the image a bit at a time, removing waste memory at each chunk
    for (m in 1:4){
      for (n in 1:4){
        image(x = (m * 2000 - 2000):(m * 2000 - 1) + .5, # pixels are centered..
              y = (n * 2000 - 2000):(n * 2000 - 1) + .5, 
              t(A[(m * 2000 - 1999):(m * 2000), (n * 2000 - 1999):(n * 2000)]), 
              useRaster = TRUE, # this is key
              add = TRUE)     
        gc() # my naive guess is that this keeps wasted mem from building up
      }
    }

これにより、ウィンドウにプロットされたものが、私が考えることができる限り経済的になります。一度にAの一部だけをメモリに入れることで、同じことを行うことができます。

于 2012-08-08T05:56:46.290 に答える