我有矢量:
v1 = c(1,2,3)
从这个向量我想创建矩阵,其中i,j
位置上的元素将是sum
位置上的向量成员的i,j
:
[,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 :这是我的问题的简化版本
答案 0 :(得分:1)
有一种方法比使用2个嵌套循环的简单计算快得多。它没有按照您在问题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 100