首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只计算矩阵的上三角

只计算矩阵的上三角
EN

Stack Overflow用户
提问于 2016-05-04 14:09:19
回答 1查看 1K关注 0票数 2

我有向量:

代码语言:javascript
复制
v1 = c(1,2,3)

在这个向量中,我想要创建矩阵,其中i,j位置上的元素将是i,j位置上向量成员的sum

代码语言:javascript
复制
      [,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命令,而是问如何防止计算这些元素。

PS:这是我问题的简化版本

EN

回答 1

Stack Overflow用户

发布于 2016-05-04 14:55:00

有一种方法比直接计算两个嵌套循环要快得多。它没有按照你在问题1中描述的那样进行优化,但是它非常快,因为它是矢量化的。也许,这对你来说就足够了。矢量法(甚至矩阵法)本身:

代码语言:javascript
复制
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

我们还可以为执行基准测试的简单方法创建一个函数。这个函数做的比需要的更少:它只计算上三角形,但我们会看到它要慢得多。

代码语言:javascript
复制
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

基准:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37030260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档