我有一个相当大的(1040x1392)双精度矩阵,我想提取另一个矩阵,其列是第一个矩阵的 16x16 块。(我知道,这是很多数据,使用它可能不实用,但这应该可以......)
我尝试使用此代码,其中“数据”是原始矩阵:
# Create a matrix of starting coordinates for each patch
patch.size = 16
patch.inc = patch.size - 1
coords = expand.grid(x=1:(ncol(data)-patch.inc), y=1:(nrow(data)-patch.inc))
coords = as.matrix(coords)
# Pre-allocate the destination matrix
patches = double(nrow(coords)*patch.size^2)
dim(patches) = c(patch.size^2, nrow(coords))
#Create overlapping patches
for (i in 1:nrow(coords))
{
x=coords[i,1]
y=coords[i,2]
patches[,i] = as.vector(data[y:(y+patch.inc), x:(x+patch.inc)])
}
这在具有 8GB RAM 的相当快的 Win7-64 机器上运行得非常慢;即使只创建 100 个补丁也很慢。
事实证明,分配给 patch[,i] 是问题所在。查看任务管理器,当我分配给 patch[,i] 时,内存使用量出现了巨大的峰值。
我有一些问题。首先,发生了什么?看起来整个补丁矩阵正在被复制到每个分配中。是对的吗?如果是这样,为什么?我认为预先分配补丁矩阵可以避免这种情况。其次,有没有更好的方法来编写这段代码,这样它就可以在我的有生之年完成:-)?
谢谢!肯特