Image 在R中连接图像
我试图在R中将一个大矩阵(8000 x 8000)绘制为光栅图像。不幸的是,这对我的32位操作系统来说需要太多内存,因此在重新组合之前,我将数据绘制为两个(4000 x 8000)图像 我看过很多软件包,但没有找到合适的功能。我知道图像是作为S4对象导入的,颜色存储在一个数组中,这意味着应该有一种方法将它们组合在一起,但我无法理解。有人知道在R里怎么做吗? 谢谢 编辑: 数据存储在8000个csv文件中,其中file1对应于矩阵的第一行,file2对应于第二行 示例代码Image 在R中连接图像,image,r,memory,concatenation,Image,R,Memory,Concatenation,我试图在R中将一个大矩阵(8000 x 8000)绘制为光栅图像。不幸的是,这对我的32位操作系统来说需要太多内存,因此在重新组合之前,我将数据绘制为两个(4000 x 8000)图像 我看过很多软件包,但没有找到合适的功能。我知道图像是作为S4对象导入的,颜色存储在一个数组中,这意味着应该有一种方法将它们组合在一起,但我无法理解。有人知道在R里怎么做吗? 谢谢 编辑: 数据存储在8000个csv文件中,其中file1对应于矩阵的第一行,file2对应于第二行 示例代码 # get the na
# 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
#获取每个矩阵行文件的名称
#每个文件是长度为8000的向量,每个文件i对应于矩阵行i
a试着缩小矩阵,你真的需要那个细节吗?像这样做增量rbind会破坏性能,而且绘图也无法工作,光栅图像需要设置一个现有的绘图。试着带着你真正的目标提问,这不是一个好办法。我在查看系统监视器上的内存时尝试了以下方法,但它始终保持在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你能给出一些你想做什么的示例代码吗?还有,为什么不把它们绘制成矢量图像,然后在R之外进行缩放呢?我添加了一个最小的代码示例。稍微澄清一下,矩阵是~1GB,R处理得很好。当我调用绘图函数(plot、ggplot、rasterImage)时,绘图函数会在处理数据时创建大型内部对象,从而停止R的工作。我假设在尝试保存为矢量格式(.png或.svg)时也会发生同样的情况欢迎使用StackOverflow。如果您真的简化了示例代码,使其在我的机器上运行并生成两个图像打印,我将看一看。例如,构造两个10x10的随机数矩阵。由于您知道如何读取文件,因此这不是您的问题的一部分。另外,删除png()
和dev.off()
——这也不是你的问题的一部分。谢谢你的回复,这是解决问题的一个非常聪明的方法。这比与物体搏斗要简单得多。不过,在R中,我从来没有真正充分利用过垃圾收集器;如果我定义了一个巨大的对象,用rm()将其删除,然后调用gc(),内存仍然会有一段时间是满的。gc()没有更好的效果。谢谢你的代码,你的方法应该工作得很好。在这种情况下,是的。我正在制作的图像是一个分形图像,我希望在不使用zoom()函数的情况下以近放大倍数查看它。无论如何,我知道这是一种非常愚蠢的做事方式;bigmatrix包将更适合,因为预分配会提高性能。我只是把这个方法作为一个技术挑战,看看我是否能让它工作:)好的,只需预先分配矩阵而不是rbind,它应该工作得很好