Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 只计算矩阵的上三角_R_Matrix - Fatal编程技术网

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