【问题标题】:The diag() function in RR 中的 diag() 函数
【发布时间】:2013-12-10 08:39:28
【问题描述】:

有没有办法在矩阵中使用diag() 函数而不使用内置函数或迭代?

   M<-matrix(1:9, ncol=3) # make a matrix 

    q5b<-function(M){ #function

    }

我知道M[1,1]M[2,2]M[3,3] 会给我与diag(M) 相同的输出。但是,我想不出没有 for 循环的方法。

我的思考过程是我应该有一个条件,即矩阵中的row index == column index 然后打印该值。我很感激任何建议。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用函数rowcol 查找列号与行号相同的索引:

    row(M) == col(M)
    #       [,1]  [,2]  [,3]
    # [1,]  TRUE FALSE FALSE
    # [2,] FALSE  TRUE FALSE
    # [3,] FALSE FALSE  TRUE
    
    M[row(M) == col(M)]
    # [1] 1 5 9
    

    【讨论】:

    • 不错的解决方案,但知道为什么它比diag 或我的替代方案慢得多吗?
    • @AnandaMahto 感谢您的测试。我假设我的解决方案较慢,因为必须创建两个整数矩阵,其大小与参考矩阵相同。在此之后,这些矩阵中的所有值都使用== 进行比较。因此,该解决方案效率不高。
    【解决方案2】:

    只是基于另一个矩阵的子集:

    > diag(M)
    [1] 1 5 9
    > M[matrix(rep(sequence(ncol(M)), 2), ncol = 2)]
    [1] 1 5 9
    

    上面在非方阵中会遇到问题,所以我们修改如下。

    作为您的职能,问题 5b 的一个答案可能是:

    q5b <- function(M) { 
      A <- sequence(ncol(M))[sequence(min(nrow(M), ncol(M)))]
      M[cbind(A, A)]
    }
    

    更新:基准测试总是很有趣

    library(microbenchmark)
    
    fun1 <- function(M) diag(M)
    fun2 <- function(M) M[row(M) == col(M)]
    fun3 <- function(M) {
      A <- sequence(ncol(M))[sequence(min(nrow(M), ncol(M)))]
      M[cbind(A, A)]
    }    
    
    set.seed(1)
    M <- matrix(rnorm(1000*1000), ncol = 1000)
    
    microbenchmark(fun1(M), fun2(M), fun3(M), times = 100)
    # Unit: microseconds
    #     expr       min        lq     median        uq        max neval
    #  fun1(M)  4654.825  4747.408  4822.8865  4912.690   5877.866   100
    #  fun2(M) 53270.266 54813.606 55059.0695 55749.062 200384.531   100
    #  fun3(M)    66.284    82.321   118.8835   129.361    191.155   100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2021-07-10
      • 2017-01-19
      相关资源
      最近更新 更多