[R] Split matrix into square submatices

Gabor Grothendieck ggrothendieck at gmail.com
Fri Feb 10 16:23:58 CET 2012


On Fri, Feb 10, 2012 at 3:02 AM, xiddw <xiDDdw at gmail.com> 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.
>
>> g <- split(as.data.frame(h), (1:4))
>> g
> $`1`
>  V1 V2 V3 V4 V5 V6 V7 V8
> 1  1  9 17 25 33 41 49 57
> 5  5 13 21 29 37 45 53 61
>
> $`2`
>  V1 V2 V3 V4 V5 V6 V7 V8
> 2  2 10 18 26 34 42 50 58
> 6  6 14 22 30 38 46 54 62
>
> $`3`
>  V1 V2 V3 V4 V5 V6 V7 V8
> 3  3 11 19 27 35 43 51 59
> 7  7 15 23 31 39 47 55 63
>
> $`4`
>  V1 V2 V3 V4 V5 V6 V7 V8
> 4  4 12 20 28 36 44 52 60
> 8  8 16 24 32 40 48 56 64
>
>

Try this:

h <- matrix(1:64, 8) # input

k <- kronecker(matrix(1:16, 4, byrow = TRUE), matrix(1, 2, 2))
g <- lapply(split(h, k), matrix, nr = 2)

-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



More information about the R-help mailing list