Blockwise sum of matrix elements

前端 未结 3 1727
悲哀的现实
悲哀的现实 2020-12-18 01:39

I want to go from something like this:

1> a = matrix(c(1,4,2,5,2,5,2,1,4,4,3,2,1,6,7,4),4)
1> a
     [,1] [,2] [,3] [,4]
[1,]    1    2    4    1
[2,]          


        
相关标签:
3条回答
  • 2020-12-18 02:29
    tapply(a, list((row(a) + 1L) %/% 2L, (col(a) + 1L) %/% 2L), sum)
    #    1  2
    # 1 12 15
    # 2 10 16
    

    I used 1L and 2L instead of 1 and 2 so indices remain integers (as opposed to numerics) and it should run faster that way.

    0 讨论(0)
  • 2020-12-18 02:38

    You can use matrix multiplication for this.

    # Computation matrix:
    
    mat <- function(n, r) {
      suppressWarnings(matrix(c(rep(1, r), rep(0, n)), n, n/r))
    }
    

    Square-matrix example, uses a matrix and its transpose on each side of a:

    # Reduce a 4x4 matrix by a factor of 2:
    
    x <- mat(4, 2)
    x
    ##      [,1] [,2]
    ## [1,]    1    0
    ## [2,]    1    0
    ## [3,]    0    1
    ## [4,]    0    1
    
    t(x) %*% a %*% x
    ##      [,1] [,2]
    ## [1,]   12   15
    ## [2,]   10   16
    

    Non-square example:

    b <- matrix(1:24, 4 ,6)
    t(mat(4, 2)) %*% b %*% mat(6, 2)
    ##      [,1] [,2] [,3]
    ## [1,]   14   46   78
    ## [2,]   22   54   86
    
    0 讨论(0)
  • 2020-12-18 02:41

    I guess that might help you, but still it uses sapply which can be considered as loop-ish tool.

    a <- matrix(c(1,4,2,5,2,5,2,1,4,4,3,2,1,6,7,4),4)
    block.step <- 2
    res <- sapply(seq(1, nrow(a), by=block.step), function(x) 
        sapply(seq(1, nrow(a), by=block.step), function(y) 
            sum(a[x:(x+block.step-1), y:(y+block.step-1)])
        )
    )
    res
    

    Is it anyhow helpful ?

    0 讨论(0)
提交回复
热议问题