【问题标题】:Taking the sum of blocks within a matrix in R取R中矩阵内的块总和
【发布时间】:2018-04-18 20:27:15
【问题描述】:

我有以下 9x9 矩阵。

m<-matrix(runif(9*9), nrow = 9, ncol=9)
m

     [,1]       [,2]       [,3]       [,4]       [,5]       [,6]       [,7]       [,8]       [,9]
[1,] 0.2449707 0.81326836 0.72297582 0.03551436 0.82410051 0.29909943 0.13396759 0.71995057 0.03458879
[2,] 0.2715794 0.08984877 0.36775262 0.87896437 0.51941450 0.31631194 0.19142086 0.80257639 0.05081064
[3,] 0.3741446 0.05950594 0.87952538 0.45086034 0.20399313 0.42205156 0.10122543 0.04948101 0.58620932
[4,] 0.8472067 0.56675295 0.52710442 0.35257950 0.70820007 0.30591402 0.25243479 0.81976209 0.06595630
[5,] 0.1034456 0.18511441 0.70661040 0.59577040 0.87518085 0.16782022 0.98967611 0.96391309 0.86283653
[6,] 0.3685605 0.08227258 0.24782776 0.12557143 0.97220534 0.70517827 0.01113961 0.19896752 0.45398202
[7,] 0.1305617 0.29664856 0.21321683 0.83940964 0.91064918 0.67109195 0.92055064 0.08246438 0.86575867
[8,] 0.8799545 0.52515529 0.09592935 0.43177214 0.62089808 0.04079269 0.62836857 0.70525627 0.04421984
[9,] 0.4941711 0.28413734 0.02130229 0.77447519 0.02323584 0.52432477 0.02130935 0.42077756 0.02348518

如何取这个矩阵中每个 3x3 块的总和,得到以下 3x3 矩阵?

     [,1]       [,2]       [,3]
[1,] 2.04235671 3.95031014 2.6702306
[2,] 3.63489532 4.8084201  4.61866806
[3,] 2.94107696 4.83664948 3.71219046

提前致谢!

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    如果我们借用matsplitter function from this question,我们可以这样做

    set.seed(15)
    m<-matrix(runif(9*9), nrow = 9, ncol=9)
    matrix(apply(matsplitter(m, 3, 3), 3, sum), ncol=3)
    #          [,1]     [,2]     [,3]
    # [1,] 5.067493 5.293779 5.342015
    # [2,] 4.003959 4.901462 5.236655
    # [3,] 6.319576 4.953201 5.571824
    

    与真实答案非常吻合

    sum(m[1:3, 1:3])
    # [1] 5.067493
    sum(m[1:3, 4:6])
    # [1] 4.003959
    sum(m[4:6, 1:3])
    # [1] 5.293779
    sum(m[7:9, 7:9])
    # [1] 5.571824
    

    【讨论】:

    • 由于某种原因这对我不起作用。实际上,我正在使用由 71 个国家和 34 个部门组成的 2414x2414 矩阵(其中 34 x 71 = 2414)。这个矩阵的行和列是对称的。我将如何将您的代码调整为该矩阵?
    • 我还应该提到,我希望得到一个 71x71 的矩阵(因此 34x34 的块应该在起始矩阵中求和)。非常感谢您迄今为止的帮助
    • 你试过m2&lt;-matrix(apply(matsplitter(m, 34, 34), 3, sum), ncol=71)吗?
    【解决方案2】:

    这里的其他答案可能更好/更快,但您也可以只循环块

    set.seed(15)
    m <- matrix(runif(9*9), nrow = 9, ncol=9)
    
    blocksz <- 3
    out <- matrix(NA, blocksz, blocksz)
    for(i in 1:(nrow(m)/blocksz)){
      for(j in 1:(ncol(m)/blocksz)){
        iblock <- (1:blocksz) + blocksz*(i - 1)
        jblock <- (1:blocksz) + blocksz*(j - 1)
        out[i, j] <- sum(m[iblock, jblock])
      }
    }
    

    tidyverse

    seq_len(nrow(m)/blocksz) %>% 
      expand.grid(., .) %>% 
      pmap_dbl(~sum(m[1:blocksz + blocksz*(.x - 1), 
                      1:blocksz + blocksz*(.y - 1)])) %>% 
      matrix(blocksz, byrow = T)
    

    【讨论】:

      【解决方案3】:

      你也可以创建一个模板:

      tmp <- structure(c(1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 
       2, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 5, 5, 
      5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6), .Dim = c(6L, 
      9L))
      

      然后做这样的事情:

      matrix(sapply(1:6,function(x) sum(m[which(tmp == x)])),3,3)
      

      【讨论】:

        【解决方案4】:

        一个选项可以是:

        set.seed(15)
        m<-matrix(runif(9*9), nrow = 9, ncol=9)
        
        split_lst <- split(m, rep(1:3, each=9*3))
        
        mod_m <- cbind(matrix(split_lst[[1]], nrow=3, byrow = TRUE),
                       matrix(split_lst[[2]], nrow=3, byrow = TRUE),
                       matrix(split_lst[[3]], nrow=3, byrow = TRUE))
        
        
        sapply(split(colSums(mod_m), rep(1:9, each=3)),sum)
        
        # 1        2        3        4        5        6        7        8        9 
        # 5.067493 5.293779 5.342015 4.003959 4.901462 5.236655 6.319576 4.953201 5.571824
        

        【讨论】:

          猜你喜欢
          • 2020-11-23
          • 2015-07-05
          • 1970-01-01
          • 2016-09-06
          • 2016-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多