【问题标题】:Sample equidistant points from a numeric vector从数值向量中采样等距点
【发布时间】:2014-06-02 11:02:22
【问题描述】:

我有一个数字向量:

vec = c(1464.556644,552.6007169,155.4249747,1855.360016,1315.874155,2047.980206,2361.475519,4130.530507,1609.572131,4298.980363,697.6034771,312.080866,2790.738644,1116.406288,989.6391649,2683.393338,3032.080837,2462.137352,2964.362507,1182.894473,1268.968128,4495.503015,576.1063996,232.4996213,1355.256694,1336.607876,2506.458008,1242.918255,3645.587384)

我想从中采样n=5 点,这些点彼此之间的距离尽可能相等。换句话说,我想从vec 获得最接近这些点的点:

seq(min(vec),max(vec),(max(vec)-min(vec))/(n-1))

实现这一目标的最快方法是什么?

【问题讨论】:

    标签: r optimization sample


    【解决方案1】:

    我赞成 thelatemail,如果他没有这么快发帖,那也是我快速而肮脏的解决方案:-)

    我认为更稳健的方法是解决整数规划。例如,它将防止多次选择同一点的可能性。

    n <- 5
    N <- length(vec)
    ideal <- seq(min(vec),max(vec),(max(vec)-min(vec))/(n-1))
    
    library(lpSolve)
    cost.mat  <- outer(ideal, vec, function(x, y) abs(x-y))
    row.signs <- rep("==", n)
    row.rhs   <- rep(1, n)
    col.signs <- rep("<=", N)
    col.rhs   <- rep(1, N)
    sol <- lp.transport(cost.mat, "min", row.signs, row.rhs,
                                         col.signs, col.rhs)$solution
    
    final <- vec[apply(sol, 1, which.max)]
    

    这肯定会更慢,但在我看来,这是唯一“最佳且 100% 可靠”的方式。

    【讨论】:

    • 不错。我假设我的回答有一定程度的天真,而你已经证明了这个假设是正确的。 :-)
    【解决方案2】:

    一次尝试:

    ideal <- seq(min(vec),max(vec),(max(vec)-min(vec))/(n-1))
    result <- sapply(ideal, function(x) vec[which.min(abs(vec-x))] )
    

    比较:

    cbind(result,ideal)
    
           result    ideal
    [1,]  155.425  155.425
    [2,] 1242.918 1240.444
    [3,] 2361.476 2325.464
    [4,] 3645.587 3410.484
    [5,] 4495.503 4495.503
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2021-11-17
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多