仅计算矩阵的上三角形

时间:2016-05-04 14:09:20

标签: r matrix

我有矢量:

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

问题

  1. i,jj,i相同,因此没有理由将其计算2倍 为了更好的表现。如何实现这个目标?
  2. 如何创建也不会计算i == j元素并且只返回NA的变体?我不是要求diag(m) <- NA命令,我问的是如何防止计算这些元素。
  3. PS :这是我的问题的简化版本

1 个答案:

答案 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