R 只计算矩阵的上三角
我有向量:R 只计算矩阵的上三角,r,matrix,R,Matrix,我有向量: 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是相同的,因此没有理由计算2x 为了更好的表现。如何做到这一点 如果i==j并且只返回NA,如何创建一个变量,该变量将不会计算元素?我不是要diag(m)有一种方法比使用两个嵌
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
是相同的,因此没有理由计算2x
为了更好的表现。如何做到这一点i==j
并且只返回NA
,如何创建一个变量,该变量将不会计算元素?我不是要diag(m)有一种方法比使用两个嵌套循环的直接计算要快得多。它没有像你在问题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
外部(v1,v1,“+”)
?如果这还不够快,Rcpp是你最好的选择。我认为Rcpp书中有上三角形计算作为案例研究,但我的记忆可能是错误的。这远不如outer()
函数快。同样,这样的方法速度较慢m[lower.tri(m)]
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