1

我正在尝试在 R 中将大矩阵 (8,000 x 8,000) 绘制为光栅图像。不幸的是,这对于我的 32 位操作系统需要太多内存,因此我将数据绘制为两个 (4000 x 8000) 图像之前重新组合它们。

看了很多包,都没有找到合适的功能。我知道图像是作为 S4 对象导入的,颜色存储在一个数组中,这意味着应该有一种方法来组合它们,但我无法弄清楚。有谁知道如何在 R 中做到这一点?谢谢

编辑:

数据存储在8000个csv文件中,file1对应矩阵的第一行,file2对应第二行...

示例代码

# 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

我在查看系统监视器上的内存时尝试了以下操作,它始终保持在 3 Gb 以下:

    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 回答