Message-ID: <CAP01uR=98AAsh-roFruC9ZZHoaWfpxznP39PFNWY+yFQ8t4B-g@mail.gmail.com>
Date: 2012-02-10T15:23:58Z
From: Gabor Grothendieck
Subject: Split matrix into square submatices
In-Reply-To: <1328860945925-4375563.post@n4.nabble.com>
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