我正在尝试在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
答案 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来做同样的事情。