我有向量:
v1 = c(1,2,3)在这个向量中,我想要创建矩阵,其中i,j位置上的元素将是i,j位置上向量成员的sum:
[,1] [,2] [,3]
[1,] 2 3 4
[2,] 3 4 5
[3,] 4 5 6问题
i,j和j,i是相同的,因此没有理由计算它2倍以获得更好的性能。如何做到这一点?i == j只返回NA,那么如何创建不计算元素的变量?我不是要diag(m) <- NA命令,而是问如何防止计算这些元素。PS:这是我问题的简化版本
发布于 2016-05-04 14:55:00
有一种方法比直接计算两个嵌套循环要快得多。它没有按照你在问题1中描述的那样进行优化,但是它非常快,因为它是矢量化的。也许,这对你来说就足够了。矢量法(甚至矩阵法)本身:
f1 <- function(x){
n <- length(x)
m <- matrix(rep(x,n),n)
m + t(m)
}
> f1(1:3)
[,1] [,2] [,3]
[1,] 2 3 4
[2,] 3 4 5
[3,] 4 5 6我们还可以为执行基准测试的简单方法创建一个函数。这个函数做的比需要的更少:它只计算上三角形,但我们会看到它要慢得多。
f2 <- function(x){
n <- length(x)
m <- matrix(rep(NA,n^2),n)
for(i in 1:(n-1)){
for(j in (i+1):n) m[i,j] <- x[[i]] + x[[j]]
}
m
}
> f2(1:3)
[,1] [,2] [,3]
[1,] NA 3 4
[2,] NA NA 5
[3,] NA NA NA基准:
library(microbenchmark)
> microbenchmark(f1(1:100), f2(1:100))
Unit: microseconds
expr min lq mean median uq max neval
f1(1:100) 124.775 138.6175 181.6401 187.731 196.454 294.301 100
f2(1:100) 10227.337 10465.1285 11000.1493 10616.830 10907.148 15826.259 100https://stackoverflow.com/questions/37030260
复制相似问题