代码之家  ›  专栏  ›  技术社区  ›  Manuel R

计算两点之间的所有可能坡度

  •  2
  • Manuel R  · 技术社区  · 6 年前

    我有两个向量

    x <- rnorm(100)
    y <- rnorm(100)
    

    我需要计算所有点之间的斜率(公式:y2-y1/x2-x1)。所以我需要点之间的坡度 (x1, y1) (x1, y2) , (x1,y1) (x1, y3) …、(x2、y2)和(y2、y3)等,总计为 choose(n, 2) 斜坡。

    如何在R中执行该操作 有效地 (我需要多次运行,因此效率在这里非常重要)

    2 回复  |  直到 6 年前
        1
  •  4
  •   Zheyuan Li    6 年前

    如果你需要 choose(n, 2) 斜坡间 n (x, y) 点、用途

    xy <- cbind(x, y)
    library(RcppAlgos)
    ind <- comboGeneral(nrow(xy), 2)
    d <- xy[ind[, 2], ] - xy[ind[, 1], ]
    slope <- d[, 2] / d[, 1]
    

    我不在用 combn 来自R核心的功能。见 Product between all combinations of a vector's elements 用于案例研究。

        2
  •  1
  •   G. Grothendieck    6 年前

    使用末尾注释中的数据,假设需要选择2个坡度。

    slopes <- c(combn(y, 2, diff) / combn(x, 2, diff))
    slopes
    ## [1] -3.7970202 -1.4062612 -3.8066222 -3.1325626 -0.9648338 -3.8171698
    ## [7] -2.5220191 -0.3885287 -0.5732387  4.1033272
    

    这些分别是这些对的斜率:

    nms <- combn(n, 2, paste, collapse = ":")
    nms
    ## [1] "1:2" "1:3" "1:4" "1:5" "2:3" "2:4" "2:5" "3:4" "3:5" "4:5"
    
    all.equal(slopes, slopes2[order(nms2)])
    

    补充

    如果速度不够快,试试看 combnPrim 从GRBASE(在生物导体中)代替:

    library(gRBase)
    
    xx <- combnPrim(x, 2)
    yy <- combnPrim(y, 2)
    slopes2 <- (yy[2, ] - yy[1, ]) / (xx[2, ] - xx[1, ])
    slopes2
    ## [1] -3.7970202 -1.4062612 -0.9648338 -3.8066222 -3.8171698 -0.3885287
    ## [7] -3.1325626 -2.5220191 -0.5732387  4.1033272
    
    nms2 <- apply(combnPrim(n, 2), 2, paste, collapse = ":")
    ## [1] "1:2" "1:3" "2:3" "1:4" "2:4" "3:4" "1:5" "2:5" "3:5" "4:5"
    
    all.equal(slopes, slopes2[order(nms2)])
    ## [1] TRUE
    

    注释

    我们使用以下输入:

    set.seed(123)
    n <- 5
    x <- rnorm(n)
    y <- rnorm(n)