Re: [R] Split matrix into square submatices

2012-02-10 Thread Petr Savicky
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,]19   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,]19
 [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,]19
  [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.

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Split matrix into square submatices

2012-02-10 Thread Gabor Grothendieck
On Fri, Feb 10, 2012 at 3:02 AM, xiddw xid...@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

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


Re: [R] Split matrix into square submatices

2012-02-10 Thread xiddw
Thanks to Peter and Gabriel for their comments,

The first way which Peter commented was my first approach, however as I use
it for a 'large' matrix (in my case nrow = ncol = 512) and I want to split
it into very small matrices (e.g. nrow = ncol = {4, 8, 16}) both nested
loops I think are a quite expensive and that's why I was looking for a
better way.

The Gabor's approach works perfect for my needs, thanks :)

--
View this message in context: 
http://r.789695.n4.nabble.com/Split-matrix-into-square-submatices-tp4375563p4376952.html
Sent from the R help mailing list archive at Nabble.com.

__
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.