R 脱机正交范围计数的实现

R 脱机正交范围计数的实现,r,computational-geometry,R,Computational Geometry,我正在研究的一个统计问题似乎需要做一些计算几何中称为“离线正交范围计数”的事情: 假设我有一组n个点(目前,在平面上)。对于每一对点i和j,我想计算集合中剩余的点的数量,这些点位于对角线为端点i和j的线段的矩形中。然后,总输出是[0,1,2,…,n-2]中的n(n-1)个值的向量 我已经看到关于这个问题(或者至少是一个非常类似的问题)的大量文献,但是我找不到一个实现。我更喜欢R(一种统计计算语言)软件包,但我想这要求太高了。一个开源的C/C++实现也可以工作 谢谢。我希望我能很好地理解你的问题。

我正在研究的一个统计问题似乎需要做一些计算几何中称为“离线正交范围计数”的事情:

假设我有一组n个点(目前,在平面上)。对于每一对点i和j,我想计算集合中剩余的点的数量,这些点位于对角线为端点i和j的线段的矩形中。然后,总输出是[0,1,2,…,n-2]中的n(n-1)个值的向量

我已经看到关于这个问题(或者至少是一个非常类似的问题)的大量文献,但是我找不到一个实现。我更喜欢R(一种统计计算语言)软件包,但我想这要求太高了。一个开源的C/C++实现也可以工作


谢谢。

我希望我能很好地理解你的问题。这里是在R中使用包
geometry
实现的。我使用

计算点p到矩形边界的有符号距离的mesh.drectangle
函数

  • 我使用
    combn
  • 对于组合的每个点p,我计算矩形rectp到其他点的距离
  • 如果距离<0,我选择点
  • 比如说

    library(geometry)
    ## I generate some data 
    set.seed(1234)
    p.x <- sample(1:100,size=30,replace=T)
    p.y <- sample(1:100,size=30,replace=T)
    points <- cbind(p.x,p.y)
    
    ## the  algortithm
    ll <- combn(1:nrow(points),2,function(x){
         x1<- p.x[x[1]]; y1 <- p.y[x[1]]
         x2<- p.x[x[2]]; y2 <- p.y[x[2]]
         p <- points[-x,]
         d <- mesh.drectangle(p,x1,y1,x2,y2)
         res <- NA
         if(length(which(d <0))){
            points.in = as.data.frame(p,ncol=2)[ d < 0 , ]
           res <- list(n = nrow(points.in), 
                        rect = list(x1=x1,x2=x2,y1=y1,y2=y2),
                        points.in = points.in)
         }
         res
    },simplify=F)
    ll <- ll[!is.na(ll)]
    
    ## the result
    nn <- do.call(rbind,lapply(ll,'[[','n'))
    
    库(几何体)
    ##我生成一些数据
    种子集(1234)
    
    p、 有许多带有对角线的矩形。你是说边平行于x轴和y轴的矩形吗?另外,您正在分析的模式中可能有多少点(即,计算速度/效率是否重要)?我想我知道您在寻找什么,但请记住包含图像或图像链接?找不到任何视觉效果。是:轴平行sides@bennos:我有一个O(n^2)溶液。但是它依赖于二维结构,在更高的维度上不起作用。@bennos:这个想法是计算网格上由每个轴上的唯一值定义的双重累积和(可以在O(n^2)中完成)。任何单轴平行矩形中的点之和可以根据该累积和以O(1)计算。因为我们有O(n^2)对,或者说是矩形,所以这个东西是整体的O(n^2)。谢谢。我真的很喜欢可视化,这是一个很好的例子。不过,我一直在寻找一种比暴力O(n^3)更有效的解决方案。例如@skauf Thank中描述的算法的一个实现,我也喜欢:)应用算法需要10分钟,但进行可视化需要3小时……如何知道它是O(n^3)?
    library(grid)
    grid.newpage()
    vp <- plotViewport(xscale = extendrange(p.x),
                              yscale = extendrange(p.y))
    pushViewport(vp)
    grid.xaxis()   
    grid.yaxis()
    grid.points(x=points[,'p.x'],y=points[,'p.y'],pch='*')
    cols <- rainbow(length(ll))
    ll <- ll[nn == 5]           ## here I plot only the rectangle with 5 points 
    lapply(seq_along(ll),function(i){
                x <- ll[[i]]
                col <- sample(cols,1)
                x1<- x$rect$x1; x2<- x$rect$x2
                y1<- x$rect$y1; y2<- x$rect$y2
                grid.rect(x=(x1+x2)*.5,y=(y1+y2)*.5,
                          width= x2-x1,height = y2-y1,
                          default.units ='native',
                          gp=gpar(fill=col,col='red',alpha=0.2)
                          )
                grid.points(x=x$points.in$p.x,y=x$points.in$p.y,pch=19,
                            gp=gpar(col=rep(col,x$n))) 
    
     }
    )
    upViewport()