# Matrix indexing in a loop

6 messages
Open this post in threaded view
|

## Matrix indexing in a loop

 How do you specify matrix location a[i,j] (or a[i-1,j], etc.) in a "for" loop?   I am looking for a flexible method of indexing neighbors over a series of lags (1,2,3...) and I may wish to extend this method to 3D arrays. Example: Data matrix > fun      [,1] [,2] [,3] [1,]    1    5    9 [2,]    2    6   10 [3,]    3    7   11 [4,]    4    8   12 For each element a[i,j] in "fun", sum the 1st order (Rook's) neighbors: a[i-1,j] a[i+1,j] a[i,j-1] a[i,j+1] Then divide by the number of elements included as neighbors-- this number depends on the location of a[i,j] in the matrix. Insert the product of the neighbor calculation for each a[i,j] into the corresponding position b[i,j] in an empty matrix with the same dimensions as "fun". For example, element [2,2] in "fun" should yield element [2,2] in a new matrix equal to 24/4=6.  Of course, element [1,1] in the new matrix should be the product of only two numbers. Thanks J. Mills         [[alternative HTML version deleted]] ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Open this post in threaded view
|

## Re: Matrix indexing in a loop

 Do you have to use a loop?  The following function should do what you want for the 1st order: rook = function(Y) {         rsub = function(Z) {                 X = matrix(0,nrow(Z),ncol(Z));                 X[1:(N-1),1:M] = X[1:(N-1),1:M] + Z[2:N,1:M];                 X[2:N,1:M] = X[2:N,1:M] + Z[1:(N-1),1:M];                 X[1:N,1:(M-1)] = X[1:N,1:(M-1)] + Z[1:N,2:M];                 X[1:N,2:M] = X[1:N,2:M] + Z[1:N,1:(M-1)];                 return(X);         }         return(rsub(Y)/rsub(matrix(1,nrow(Y),ncol(Y)))); } I'm not sure I understand how the higher orders work.  For example, an interior element for the 1st order is always divided by 4.  Is an interior element for a 3rd order divided by 4 or 8 or something else?  Also, how are you implementing your 3D matrices? --Brett -----Original Message----- From: [hidden email] [mailto:[hidden email]] On Behalf Of Mills, Jason Sent: Friday, February 17, 2006 1:36 PM To: [hidden email] Subject: [R] Matrix indexing in a loop How do you specify matrix location a[i,j] (or a[i-1,j], etc.) in a "for" loop?   I am looking for a flexible method of indexing neighbors over a series of lags (1,2,3...) and I may wish to extend this method to 3D arrays. Example: Data matrix > fun      [,1] [,2] [,3] [1,]    1    5    9 [2,]    2    6   10 [3,]    3    7   11 [4,]    4    8   12 For each element a[i,j] in "fun", sum the 1st order (Rook's) neighbors: a[i-1,j] a[i+1,j] a[i,j-1] a[i,j+1] Then divide by the number of elements included as neighbors-- this number depends on the location of a[i,j] in the matrix. Insert the product of the neighbor calculation for each a[i,j] into the corresponding position b[i,j] in an empty matrix with the same dimensions as "fun". For example, element [2,2] in "fun" should yield element [2,2] in a new matrix equal to 24/4=6.  Of course, element [1,1] in the new matrix should be the product of only two numbers. Thanks J. Mills         [[alternative HTML version deleted]] ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide! http://www.R-project.org/posting-guide.html______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Open this post in threaded view
|

## Re: Matrix indexing in a loop

Open this post in threaded view
|

## Re: Matrix indexing in a loop

 In reply to this post by Mills, Jason For 2d here is a solution based on zoo.  It turns the matrix into a time series and lags it forwards and backwards and does the same for its transpose in order to avoid index machinations. The function is called rook2 and it first defines three local functions, one that converts NAs to zero, one that does a lag using na.pad = TRUE and one to invoke Lag and add up the lags: library(zoo) rook2 <- function(x, i = 1) {    na2zero <- function(x) ifelse(is.na(x), 0, x)    Lag <- function(x, i) na2zero(lag(zoo(x), i, na.pad = TRUE))    Rook <- function(x, i) Lag(x, i) + Lag(x, -i) + t(Lag(t(x), i) + Lag(t(x), -i))    Rook(x, i) / Rook(1+0*x, i) } # test m <- matrix(1:24, 6) rook2(m) On 2/17/06, Mills, Jason <[hidden email]> wrote: > > How do you specify matrix location a[i,j] (or a[i-1,j], etc.) in a "for" > loop? > > I am looking for a flexible method of indexing neighbors over a series > of lags (1,2,3...) and I may wish to extend this method to 3D arrays. > > > Example: > > Data matrix > > fun >     [,1] [,2] [,3] > [1,]    1    5    9 > [2,]    2    6   10 > [3,]    3    7   11 > [4,]    4    8   12 > > > For each element a[i,j] in "fun", sum the 1st order (Rook's) neighbors: > > a[i-1,j] > > a[i+1,j] > > a[i,j-1] > > a[i,j+1] > > Then divide by the number of elements included as neighbors-- this > number depends on the location of a[i,j] in the matrix. > > > Insert the product of the neighbor calculation for each a[i,j] into the > corresponding position b[i,j] in an empty matrix with the same > dimensions as "fun". > > > For example, element [2,2] in "fun" should yield element [2,2] in a new > matrix equal to 24/4=6.  Of course, element [1,1] in the new matrix > should be the product of only two numbers. > > > Thanks > > J. Mills > >        [[alternative HTML version deleted]] > > ______________________________________________ > [hidden email] mailing list > https://stat.ethz.ch/mailman/listinfo/r-help> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html> ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide! http://www.R-project.org/posting-guide.html