एक मैट्रिक्स प्रत्येक पंक्ति में एक दो आयामी क्षेत्र को निर्धारित कर, और एक अन्य मैट्रिक्स निर्दिष्ट बिंदु एक विमान में विचार करें:प्रभावी खोज
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 में पंक्तियों की संख्या के रूप में इस बल्कि धीमी गति से हो जाता है और मैं एक उचित vectorized दृष्टिकोण के लिए देख रहा हूँ .. ।
अग्रिम धन्यवाद ...
सबसे अच्छा थॉमस
ई डीआईटी:
किसी भी दिलचस्पी के लिए मैंने आरसीपीपी का उपयोग करके सी ++ में एक फ़ंक्शन बनाया जो लगभग 50x प्रदर्शन सुधार प्रदान करता है। मैं सी में धाराप्रवाह ++ तो यह संभवतः बेहतर किया जा सकता है नहीं कर रहा हूँ ... इस समारोह के
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'])
}
एक दोष यह है कि यह मान लिया गया एक बिंदु केवल एक ही क्षेत्र से संबंधित हो सकता है ...
सबसे तेजी से स्थानिक सूचकांक (मुझे लगता है कि SQLite ऐसा कर सकते हैं) के साथ एक डेटाबेस में डेटा डाल करने के लिए शायद है http://en.wikipedia.org/wiki/R-tree))। –
यदि कोई सॉफ़्टवेयर के लिए डब्ल्यू/एक्सेस है जो निर्धारित करता है कि आपके औसत डेस्कटॉप जीयूआई में एकाधिक ओवरलैड विंडो कैसे आकर्षित करें, तो यह निश्चित रूप से एक ही समस्या की तरह दिखता है। –
@VincentZoonekynd मुझे यह विचार पसंद है, खासकर क्योंकि आर-पेड़ इस तरह की समस्याओं के अनुरूप दिखते हैं (उन्हें पहले नहीं पता था)। हालांकि डेटाबेस बनाने के ऊपरी हिस्से पर कुछ परीक्षण करना है ... – ThomasP85