计算两点之间的所有可能斜率

时间:2018-09-03 15:25:34

标签: r performance

我有两个向量

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 个答案:

答案 0 :(得分:4)

如果您需要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]

我没有使用R core的combn函数。有关案例研究,请参见Product between all combinations of a vector's elements

答案 1 :(得分:1)

使用末尾注释中的数据,并假设n选择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)])

添加

如果那还不够快,请尝试从gRBase(位于Bioconductor中)尝试combnPrim

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)