[R] setting off-diagonals to zero

Berend Hasselman bhh at xs4all.nl
Wed Jan 23 17:31:34 CET 2013


On 23-01-2013, at 16:13, emorway <emorway at usgs.gov> wrote:

> The following 1460 x 1460 matrix can be throught of as 16 distinct 365 x 365
> matrices.  I'm trying to set off-diaganol terms in the 16 sub-matrices with
> indices more than +/- 5 (days) from each other to zero using some for loops. 
> This works well for some, but not all, of the for loops.  The R code I"m
> using follows.  For some reason the third loop below zero's-out everything
> in the sub-quadrant it is targeting, which is readily observable when
> viewing the matrix ("View(MAT)").
> 
> library(Matrix)
> MAT<-matrix(rnorm(1460*1460,mean=0,sd=1),nrow = 1460, ncol = 1460)
> 
> #works great
> for (i in 1:365) {  
>  SEQ <- (i - 5):(i + 5)
>  SEQ <- SEQ[SEQ > 0 & SEQ < 366]  
>  MAT[(1:365)[-SEQ], i] <- 0      
> }
> 
> #works great
> for (i in 1:365) {  
>  SEQ <- (i - 5):(i + 5)
>  SEQ <- SEQ[SEQ > 0 & SEQ < 366]  
>  MAT[(1:365)[-SEQ], i + 365] <- 0      
> }
> 
> #zero's out everything, including main-diagonal and near-main-diagonal
> terms???
> for (i in 731:1095) {  
>  SEQ <- (i - 5):(i + 5)
>  SEQ <- SEQ[SEQ > 730 & SEQ < 1096]  
>  MAT[(731:1095)[-SEQ], i + 365] <- 0      
> }
> 
> View(MAT)
> 
> I'm not sure why the third FOR loop above is not leaving the main-diagonal
> and near-main-diagonal terms alone?


Because -SEQ in the last expression is not referencing the correct  elements.
The first element of (731:1009) has index 1 and not 731.
So as far as I can see  the last expression should be something like

MAT[(731:1095)[-(-730+SEQ)], i + 365] <- 0

Berend



More information about the R-help mailing list