以下代码的快速替代方案

时间:2016-01-12 15:24:18

标签: r

我必须计算一个矩阵。我写了以下代码

unq_x <- c(102,10226,1026,1024)

unq_x <- as.data.frame(unq_x)

mat1 <- matrix(nrow=nrow(unq_x),ncol=nrow(unq_x))

dim(mat1)



x_distance <- function(i,j)

{
  x1 =unq_x[i,]

 x2 = unq_x[j,]


  dist <- 1 - (x1-x2)/x2
  return(dist)
}

for (i in 1:nrow(unq_x))
{
  for (j in 1:nrow(unq_x))
  {
    mat1[i,j]=x_distance(i,j) 
  }
}

这很好用。但我的unq_x有10000个数字,这增加了代码运行时间。我可以使用其他替代方法而不是for循环来加强代码

3 个答案:

答案 0 :(得分:3)

这是outer

的工作
x <- c(102,10226,1026,1024)
mat2 <- outer(x,x,FUN=function(x,y) 1-(x-y)/y)

> all(mat1 == mat2)
[1] TRUE

答案 1 :(得分:0)

这以unq_x的每个元素以矢量化方式应用函数。 t只是使其与原始答案完全相同。

unq_x <- c(102,10226,1026,1024)
mat2 = t(sapply(unq_x, function(x, y) { 1 - (x - y)/y }), y = unq_x)

> all(mat1 == mat2)
[1] TRUE

不完全是一个万无一失的基准,但我停止了循环,因为它需要永远运行。

x <- c(runif(min = 1, max =1000, n = 10000))
ptm = proc.time()
m = t(sapply(x, function(x, y) { 1 - (x - y)/y }, y = x))
proc.time() - ptm
   user  system elapsed 
  7.347   1.528  36.006 

虽然A.韦伯的评论显然是最好的答案。

ptm = proc.time()
m = 2 - outer(x, x, `/`)
proc.time() - ptm
   user  system elapsed 
  0.826   0.813   4.276 

答案 2 :(得分:0)

# Can be arranged as matrix arithmetic
x <- c(102,10226,1026,1024)
mat1 <- -x %*% t(1/x) +2