[R] Split matrix into square submatices

Petr Savicky savicky at cs.cas.cz
Fri Feb 10 16:09:15 CET 2012


On Fri, Feb 10, 2012 at 12:02:25AM -0800, xiddw wrote:
> Hi everybody, 
> 
> I'm looking for an optimal way to split  a big matrix  (e.g. ncol = 8,
> nrow=8)  into small square submatrices  (e.g. ncol=2, nrow=2)
> 
> For example
> 
> If I have 
> 
> >  h
>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
> [1,]    1    9   17   25   33   41   49   57
> [2,]    2   10   18   26   34   42   50   58
> [3,]    3   11   19   27   35   43   51   59
> [4,]    4   12   20   28   36   44   52   60
> [5,]    5   13   21   29   37   45   53   61
> [6,]    6   14   22   30   38   46   54   62
> [7,]    7   15   23   31   39   47   55   63
> [8,]    8   16   24   32   40   48   56   64
> 
> and I want to split matriz h into 16 small submatrices:
> 
> > g[1]
>      [,1] [,2]
> [1,]    1    9
> [2,]    2   10
> 
> > g[2]
>      [,1] [,2]
> [1,]   17   25
> [2,]   18   26
> 
> ...
> 
> > g[4]
>      [,1] [,2]
> [1,]   49   57
> [2,]   50   58
> 
> ...
> 
> > g[16]
>      [,1] [,2]
> [1,]   55   63
> [2,]   56   64
> 
> Always the big matrix would be a square matrix and also would have a nrow
> and ncol in order of  a power of two, so it always could  be splitted in at
> least halves. 
> 
> Until now, I'm able to split a matrix but keeping the number of original
> matrix columns.
> 
> I mean, if I want to split into 16 submatrices, using the following command
> what I get its 4 lists: 
> But I haven't found a way to split resultant lists in order to get 4
> matrices for each list.

Hi.

Try the following.

  k <- 3
  n <- 2^k
  m <- 2^(k - 2)
  a <- matrix(1:n^2, nrow=n, ncol=n)
  g <- vector("list", length=16)
  
  k <- 1
  for (j in 0:3) {
      for (i in 0:3) {
          g[[k]] <- a[m*i + 1:m, m*j + 1:m]
          k <- k + 1
      }
  }
  
  g[1:5]
  
  [[1]]
       [,1] [,2]
  [1,]    1    9
  [2,]    2   10
  
  [[2]]
       [,1] [,2]
  [1,]    3   11
  [2,]    4   12
  
  [[3]]
       [,1] [,2]
  [1,]    5   13
  [2,]    6   14
  
  [[4]]
       [,1] [,2]
  [1,]    7   15
  [2,]    8   16
  
  [[5]]
       [,1] [,2]
  [1,]   17   25
  [2,]   18   26

  ...

Hope this helps.

Petr Savicky.



More information about the R-help mailing list