【问题标题】:Concatenating images in R在 R 中连接图像
【发布时间】:2012-08-07 06:18:16
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 你能给出一些你想要做什么的示例代码吗?另外,为什么不将它们绘制为矢量图像,然后在 R 之外对其进行缩放?
  • 我添加了一个最小的代码示例。为了澄清一点,矩阵是~1GB,R可以很好地处理。当我调用绘图函数(plot、ggplot、rasterImage)时,绘图函数会在处理数据时创建大型内部对象,这会阻止 R 工作。我假设尝试另存为矢量格式(.png 或 .svg)时也会发生同样的情况
  • 欢迎来到 StackOverflow。如果您真的简化示例代码,使其在我的机器上运行并生成两个图像图,我会看一下。例如,构造两个 10x10 的随机数矩阵。由于您知道如何读取文件,因此这不是您的问题的一部分。另外,删除png()dev.off() - 这也不是您的问题的一部分。

标签: image r memory concatenation


【解决方案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 来做同样的事情。

【讨论】:

  • 感谢您的回复,这是一个非常聪明的解决问题的方法。这比与 S4 对象摔跤要简单得多。不过,我从来没有真正从 R 中的垃圾收集器中得到很多用处。如果我定义了一个巨大的对象,用 rm() 删除它,然后调用 gc() 内存仍然满了一段时间。 gctorture() 并不能更好地工作。感谢您的代码,您的方法应该可以完美运行。
【解决方案2】:

试着缩小矩阵,你真的需要那个细节吗?像这样进行增量 rbind 会降低性能,而且该绘图也不起作用, rasterImage 需要设置现有的绘图。试着带着你的真正目标提问,这不是一个好方法。

【讨论】:

  • 在这种情况下,是的。我正在制作的图像是分形的,我想在不使用 zoom() 函数的情况下以近距离放大查看它。无论如何,我知道这是一种真的愚蠢的做事方式; bigmatrix 包会更合适,因为预分配会提高性能。我只是将这种方法用作技术挑战,看看我是否可以让它发挥作用:)
  • 好的,只需预先分配矩阵而不是 rbind,它应该可以正常工作
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多