【问题标题】:Extract opposite-diagonal (not off-diagonal) elements of a matrix提取矩阵的对角线(非非对角线)元素
【发布时间】:2020-02-05 05:16:41
【问题描述】:

可能是这个问题太简单了,但我找不到实用的答案。我们如何提取R中任何方阵的对角元素?在下面的示例中,这将是:7, 2, 8。

r <- matrix(c(1, 5, 8, 1:3, 7:9), 3)

【问题讨论】:

    标签: r function loops dataframe matrix


    【解决方案1】:

    一种方法可以是

    r[(n<-nrow(r))^2-(1:n)*(n-1)]
    # [1] 7 2 8
    
    ## microbenchmark (matrix(1:1e6,1000))
    # Unit: microseconds
    #         expr       min         lq        mean    median         uq      max neval
    #  r[(n<-nr...    26.897    39.0075    65.36835    47.309    85.9345   316.97   100
    #  diag(r[,... 18070.388 18905.3475 20237.09599 19956.615 20423.4695 27798.88   100
    #  rev(r[ro... 14220.609 21206.7220 21238.59515 22036.275 22599.4490 33252.58   100
    

    【讨论】:

      【解决方案2】:
      diag(r[,rev(sequence(NCOL(r)))])
      #OR
      rev(r[row(r) == NCOL(r) - col(r) + 1])
      #OR
      rev(r[(row(r) + col(r)) == (nrow(r) + 1)])
      #[1] 7 2 8
      

      【讨论】:

        【解决方案3】:

        我们还可以生成索引来提取这些元素

        n <- nrow(r)
        r[seq(n, by = n-1, length = n)]
        #[1] 8 2 7
        

        如果顺序很重要,我们可以反转提取的元素。

        rev(r[seq(n, by = n-1, length = n)])
        #[1] 7 2 8
        

        【讨论】:

        【解决方案4】:

        你可以像这样使用矩阵子集:

        r[matrix(c(1:nrow(r), ncol(r):1), ncol=2)]
        #[1] 7 2 8
        

        或者像向量子集

        r[1:nrow(r) + (ncol(r):1-1)*nrow(r)]
        #[1] 7 2 8
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-07
          • 2021-09-30
          • 2013-08-09
          • 2016-06-02
          相关资源
          最近更新 更多