虽然有许多类似的主题(例如here和here),但我的结束目标与我在SO上看到的其他问题略有不同。作为参考,我使用的是R v 3.1.0。
我有两个矩阵。每个都包含点的坐标。第一个( A )包含2,107,377个点,第二个( B )包含26,577个点。
我想在B中找到 A 中的每个点最接近的点。也就是说,我想计算 A 中的点1与 B 中的每个点之间的距离(26,577距离),并存储最小值。我想为 A (2,107,377最小值)中的每个点执行此操作。目标是根据最接近的 B 中的点将 A 中的点组合在一起。因此, B 中的某些点将不会被分配;而其他人(很多)将被分配到 A 中的多个点。
我试过了:
test = which.min(sapply(1:nrow(coordinates), function(i)
spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2),
longlat = TRUE)))
但遇到内存分配问题(无法分配> 16 Mb向量)。
我现在正在运行for循环:
for (i in 1:nrow(A)) {
minimum[i] = which.min(spDistsN1(matrix(A, ncol = 2), matrix(B[i,], ncol = 2),
longlat = TRUE))
}
但是,我期待的是,这将导致相同的结果,只是更慢。
在我尝试完全不同的方法(也许是学习raster
包)之前我想到了,我会看看是否有人有任何想法。
答案 0 :(得分:1)
尝试将数据分解为较小的块,这样就不会使内存过载。 reproducible example会有所帮助,但我认为这可以完成工作:
library(sp)
# X1 is a small example and X2 is a large example
X1 <- cbind(pointX = 1:109, pointY = 1:109)
Y1 <- cbind(x = 11:20, y = 11:20)
X2 <- cbind(pointX = 2e4 + sample(2e6), pointY = 2e4 + sample(2e6))
Y2 <- cbind(x = sample(2e4), y = sample(2e4))
nearWrapper = function(X, Y, nBatches = 10){
maxNumber = dim(X)[1]
batchNumbers <- split(0:maxNumber, ceiling(seq_along(0:maxNumber)/nBatches))
out <- numeric(maxNumber)
for(batch in 1:(nBatches+1)){
out[batchNumbers[[batch]]] <- apply(spDists(X[batchNumbers[[batch]],], Y), 1, which.min)
}
return(out)
}
smallOut <- nearWrapper(X1, Y1)
largeOut <- nearWrapper(X2, Y2)
如果这对您的数据花费的时间过长,您可能还会检查并行计算(在您的情况下使用foreach
循环代替for
循环)。