在R中连接图像

时间:2012-08-07 06:18:17

标签: image r memory concatenation

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

我看了很多包,但我找不到合适的功能。我知道图像是作为S4对象导入的,颜色存储在一个数组中,暗示应该是一种组合它们的方法,但我无法弄明白。有谁知道如何在R中这样做? 感谢

编辑:

数据存储在8000个csv文件中,file1对应矩阵的第1行,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

2 个答案:

答案 0 :(得分:1)

尝试缩小矩阵,你真的需要那个细节吗?执行这样的增量rbind会导致性能下降,并且该绘图也不起作用,rasterImage需要设置现有的绘图。尝试以你的真实目标提出问题,这不是一个好的方法。

答案 1 :(得分: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来做同样的事情。