考虑一个矩阵,每条线指定一个二维区域,另一个矩阵指定平面中的点:
xmin <- c(3, 14, 25, 61)
xmax <- c(5, 18, 27, 65)
ymin <- c(33, 12, 83, 2)
ymax <- c(35, 16, 90, 6)
regions <- cbind(xmin, xmax, ymin, ymax)
x <- c(7, 26, 4, 16)
y <- c(4, 85, 30, 13)
points <- cbind(x, y)
regions
获取包含 中每个点的索引的最快方法是什么points
?
我想要实现的一个例子是:
apply(points, 1, function(x){
which(regions[,'xmin'] < x[1] & regions[,'xmax'] > x[1] & regions[,'ymin'] < x[2] & regions[,'ymax'] > x[2])
})
regions
但是随着两者中的行数points
接近 1E5 这变得相当慢,我正在寻找一种适当的矢量化方法......
提前致谢...
最好的托马斯
编辑:
对于任何感兴趣的人,我使用 Rcpp 在 C++ 中创建了一个函数,它提供了大约 50 倍的性能改进。我不精通C++,所以它可能会做得更好......
cppFunction('
IntegerVector findInRegion(NumericVector x, NumericVector y, NumericVector xmin, NumericVector xmax, NumericVector ymin, NumericVector ymax){
int pointSize = x.size();
int regionSize = xmin.size();
IntegerVector ans(pointSize);
for(int i = 0; i < pointSize; i++){
ans[i] = NA_INTEGER;
}
for(int i = 0; i < pointSize; i++){
for(int j = 0; j < regionSize; j++){
if(x[i] > xmin[j]){
if(x[i] < xmax[j]){
if(y[i] > ymin[j]){
if(y[i] < ymax[j]){
ans[i] = j+1;
};
};
};
};
};
};
return ans;
}
')
findRegion <- function(points, regions){
if(!all(c('x', 'y') %in% colnames(points))){
stop('points must contain columns named \'x\' and \'y\'')
}
if(!all(c('xmin', 'xmax', 'ymin', 'ymax') %in% colnames(regions))){
stop('regions must contain columns named \'xmin\', \'xmax\', \'ymin\' and \'ymax\'')
}
findInRegion(points[, 'x'], points[,'y'], regions[, 'xmin'], regions[, 'xmax'], regions[, 'ymin'], regions[, 'ymax'])
}
这个函数的一个缺点是它假设一个点只能属于一个区域......