# [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.

```