Re: [R] efficient submatrix extraction

2004-09-16 Thread Peter Wolf
there are two main ideas to improve the efficiency:
1. the comparison with the limit can be done at first
2. a matrix with boxsize*boxsize rows can be defined so that
  you can apply function apply without using inner loops
*=
# parameters
size-1024; limit-0.7
# some data
set.seed(17); data-runif(size^2)
m-matrix(data,size,size)
bcount.vec-NULL
m-mlimit
for (boxsize in 2^(1:8)) {
 # inner loop:
 m-array(m,c(boxsize,size/boxsize,size))
 m-aperm(m,c(1,3,2))
 m-matrix(m,nrow=boxsize*boxsize)
 bcount.vec-c(bcount.vec,sum(apply(m,2,max)))
}
bcount-sum(bcount.vec)
print(bcount.vec)
print(bcount)
@
output-start
[1] 199099  65306  16384   4096   1024256 64 16
[1] 286245
output-end
Some remarks on your code:
The first expression in your outer loop is setting bcount to 0.
In the inner loops bcount is incremented.
But the outer loop sets bcount to the value 0 again!?
What do you want to count?
Peter
Rajarshi Guha wrote:
Hi,
 I have a matrix of say 1024x1024 and I want to look at it in chunks.
That is I'd like to divide into a series of submatrices of order 2x2.
| 1 2 3 4 5 6 7 8 ... |
| 1 2 3 4 5 6 7 8 ... |
| 1 2 3 4 5 6 7 8 ... |
| 1 2 3 4 5 6 7 8 ... |
...
So the first submatrix would be
| 1 2 |
| 1 2 |
the second one would be
| 3 4 |
| 3 4 |
and so on. That is I want the matrix to be evenly divided into 2x2
submatrices. Now I'm also doing this subdivision into 4x4, 8x8 ...
256x256 submatrices.
Currently I'm using loops and I'm sure there is a mroe efficient way to
do it:
   m - matrix(runif(1024*1024), nrow=1024)
   boxsize - 2^(1:8)
   for (b in boxsize) {
   bcount - 0
   bstart - seq(1,1024, by=b)
   for (x in bstart) {
   for (y in bstart) {
   xend - x + b - 1
   yend - y + b - 1
   if (length(which( m[ x:xend, y:yend ]  0.7))  0) {
   bcount - bcount + 1
   }
   }
   }
   }
Is there any way to vectorize the two inner loops?
Thanks,
---
Rajarshi Guha [EMAIL PROTECTED] http://jijo.cjb.net
GPG Fingerprint: 0CCA 8EE2 2EEB 25E2 AB04 06F7 1BB9 E634 9B87 56EE
---
The way to love anything is to realize that it might be lost.
__
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
 

__
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html


Re: [R] efficient submatrix extraction

2004-09-15 Thread Tony Plate
I think you should be able to do something with reassigning the dim 
attribute, and then using apply(), something along the lines of the 
following (which doesn't do your computation on the data in the subarrays, 
but merely illustrates how to create and access them):

 x - matrix(1:64,ncol=8)
 x
 [,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
 x2 - x
 dim(x2) - c(2,4,2,4)
 x2[,1,,1]
 [,1] [,2]
[1,]19
[2,]2   10
 x2[,2,,1]
 [,1] [,2]
[1,]3   11
[2,]4   12
 x2[,1,,2]
 [,1] [,2]
[1,]   17   25
[2,]   18   26
 x4 - x
 dim(x4) - c(4,2,4,2)
 x4[,1,,1]
 [,1] [,2] [,3] [,4]
[1,]19   17   25
[2,]2   10   18   26
[3,]3   11   19   27
[4,]4   12   20   28
 invisible(apply(x4, c(2,4), print))
 [,1] [,2] [,3] [,4]
[1,]19   17   25
[2,]2   10   18   26
[3,]3   11   19   27
[4,]4   12   20   28
 [,1] [,2] [,3] [,4]
[1,]5   13   21   29
[2,]6   14   22   30
[3,]7   15   23   31
[4,]8   16   24   32
 [,1] [,2] [,3] [,4]
[1,]   33   41   49   57
[2,]   34   42   50   58
[3,]   35   43   51   59
[4,]   36   44   52   60
 [,1] [,2] [,3] [,4]
[1,]   37   45   53   61
[2,]   38   46   54   62
[3,]   39   47   55   63
[4,]   40   48   56   64

hope this helps,
Tony Plate
At Wednesday 03:10 PM 9/15/2004, Rajarshi Guha wrote:
Hi,
  I have a matrix of say 1024x1024 and I want to look at it in chunks.
That is I'd like to divide into a series of submatrices of order 2x2.
| 1 2 3 4 5 6 7 8 ... |
| 1 2 3 4 5 6 7 8 ... |
| 1 2 3 4 5 6 7 8 ... |
| 1 2 3 4 5 6 7 8 ... |
...
So the first submatrix would be
| 1 2 |
| 1 2 |
the second one would be
| 3 4 |
| 3 4 |
and so on. That is I want the matrix to be evenly divided into 2x2
submatrices. Now I'm also doing this subdivision into 4x4, 8x8 ...
256x256 submatrices.
Currently I'm using loops and I'm sure there is a mroe efficient way to
do it:
m - matrix(runif(1024*1024), nrow=1024)
boxsize - 2^(1:8)
for (b in boxsize) {
bcount - 0
bstart - seq(1,1024, by=b)
for (x in bstart) {
for (y in bstart) {
xend - x + b - 1
yend - y + b - 1
if (length(which( m[ x:xend, y:yend ]  0.7))  0) {
bcount - bcount + 1
}
}
}
}
Is there any way to vectorize the two inner loops?
Thanks,
---
Rajarshi Guha [EMAIL PROTECTED] http://jijo.cjb.net
GPG Fingerprint: 0CCA 8EE2 2EEB 25E2 AB04 06F7 1BB9 E634 9B87 56EE
---
The way to love anything is to realize that it might be lost.
__
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
__
[EMAIL PROTECTED] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html