我必须计算一个矩阵。我写了以下代码
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循环来加强代码
答案 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