# setting off-diagonals to zero

9 messages
Open this post in threaded view
|

## setting off-diagonals to zero

 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?
Open this post in threaded view
|

## Re: setting off-diagonals to zero

 On 23-01-2013, at 16:13, emorway <[hidden email]> 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 ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: setting off-diagonals to zero

 I'm not following.  Printing SEQ to the screen at the intermediate steps using the following modified R code suggests that 'i' is fine and is not getting reset to 1 as you suggest?  My understanding, or rather my desired output if someone else is able to weight-in, is that the values in the second line of output (731 732 733 etc.) should not be appearing in the 3rd line of output.  The third line of output should be missing 731 thru 736.  Any suggestions on how to modify the R code are certainly welcome.  Suggested revisions will be substituted back into the third FOR loop in my original post on this thread to prevent the main- and near-main-diagonal terms from being set equal to zero. for (i in 731:732) {   SEQ <- (i - 5):(i + 5)   print(SEQ)   SEQ <- SEQ[SEQ > 730 & SEQ < 1096]   print(SEQ)   print((731:1095)[-SEQ]) } # [1] 726 727 728 729 730 731 732 733 734 735 736 # [1] 731 732 733 734 735 736 # [1]  731  732  733  734  735  736  737  738  739  740  741  742  743  744  745  746  747  748  749  750  751  752  753  754  755  756...
Open this post in threaded view
|

## Re: setting off-diagonals to zero

 In reply to this post by emorway On Jan 23, 2013, at 7:13 AM, emorway 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) > The way to do that in a single 365 x 365 matrix is: Mat <- matrix( 1:(365*365), 365, 365) Mat[ abs( col(Mat)-row(Mat) ) > 5 ] <- 0 Mat The way to propagate that pattern is to use rep(), so here is a one-liner for the task: MAT[ rep( abs( col(Mat)-row(Mat) ) > 5, 16) ] <- 0 Didn't test on you gigantuan matrix;  used smaller example: Mat <- matrix( 1:(16*16), 16, 16) test <- rbind(Mat, Mat) test[rep( abs( col(Mat)-row(Mat) ) > 2 , 2)] <- 0 test -- David. > #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? > > > > -- > View this message in context: http://r.789695.n4.nabble.com/setting-off-diagonals-to-zero-tp4656407.html> Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > [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> and provide commented, minimal, self-contained, reproducible code. David Winsemius Alameda, CA, USA ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: setting off-diagonals to zero

 In reply to this post by emorway > -----Original Message----- > From: [hidden email] [mailto:[hidden email]] > On Behalf Of emorway > Sent: Wednesday, January 23, 2013 4:59 PM > To: [hidden email] > Subject: Re: [R] setting off-diagonals to zero > > I'm not following.  Printing SEQ to the screen at the intermediate steps > using the following modified R code suggests that 'i' is fine and is not > getting reset to 1 as you suggest?  My understanding, or rather my desired > output if someone else is able to weight-in, is that the values in the > second line of output (731 732 733 etc.) should not be appearing in the > 3rd > line of output.  The third line of output should be missing 731 thru 736. > Any suggestions on how to modify the R code are certainly welcome. > Suggested revisions will be substituted back into the third FOR loop in my > original post on this thread to prevent the main- and near-main-diagonal > terms from being set equal to zero. > > for (i in 731:732) { >   SEQ <- (i - 5):(i + 5) >   print(SEQ) >   SEQ <- SEQ[SEQ > 730 & SEQ < 1096] >   print(SEQ) >   print((731:1095)[-SEQ]) > } > > # [1] 726 727 728 729 730 731 732 733 734 735 736 > # [1] 731 732 733 734 735 736 > # [1]  731  732  733  734  735  736  737  738  739  740  741  742  743 > 744 > 745  746  747  748  749  750  751  752  753  754  755  756... > > > The statement print((731:1095)[-SEQ]) does not remove the values of SEQ (i.e. 731 732 733 734 735 736) from the printed sequence, but instead uses SEQ to index into the vector created by 731:1095.  But the vector 731:1095 has length 365, so no elements are removed because the smallest value in SEQ is 731 and there are not many elements in the vector. Hope this is helpful, Dan Daniel Nordlund Bothell, WA USA   ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: setting off-diagonals to zero

 In reply to this post by emorway HI, Not sure this is what you wanted. for (i in 731:732) {   SEQ <- (i - 5):(i + 5)   print(SEQ)   SEQ <- SEQ[SEQ > 730 & SEQ < 1096]   print(SEQ)   vec1<-731:741   print(vec1[!vec1%in%SEQ]) } #[1] 726 727 728 729 730 731 732 733 734 735 736 #[1] 731 732 733 734 735 736 #[1] 737 738 739 740 741 # [1] 727 728 729 730 731 732 733 734 735 736 737 #[1] 731 732 733 734 735 736 737 #[1] 738 739 740 741 A.K. ----- Original Message ----- From: emorway <[hidden email]> To: [hidden email] Cc: Sent: Wednesday, January 23, 2013 7:58 PM Subject: Re: [R] setting off-diagonals to zero I'm not following.  Printing SEQ to the screen at the intermediate steps using the following modified R code suggests that 'i' is fine and is not getting reset to 1 as you suggest?  My understanding, or rather my desired output if someone else is able to weight-in, is that the values in the second line of output (731 732 733 etc.) should not be appearing in the 3rd line of output.  The third line of output should be missing 731 thru 736. Any suggestions on how to modify the R code are certainly welcome. Suggested revisions will be substituted back into the third FOR loop in my original post on this thread to prevent the main- and near-main-diagonal terms from being set equal to zero. for (i in 731:732) {   SEQ <- (i - 5):(i + 5)   print(SEQ)   SEQ <- SEQ[SEQ > 730 & SEQ < 1096]   print(SEQ)   print((731:1095)[-SEQ]) } # [1] 726 727 728 729 730 731 732 733 734 735 736 # [1] 731 732 733 734 735 736 # [1]  731  732  733  734  735  736  737  738  739  740  741  742  743  744 745  746  747  748  749  750  751  752  753  754  755  756... -- View this message in context: http://r.789695.n4.nabble.com/setting-off-diagonals-to-zero-tp4656407p4656461.htmlSent from the R help mailing list archive at Nabble.com. ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code. ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: setting off-diagonals to zero

 In reply to this post by emorway On 24-01-2013, at 01:58, emorway <[hidden email]> wrote: > I'm not following.  Printing SEQ to the screen at the intermediate steps > using the following modified R code suggests that 'i' is fine and is not > getting reset to 1 as you suggest? You misread. I did not say anything about 'i'. >  My understanding, or rather my desired > output if someone else is able to weight-in, is that the values in the > second line of output (731 732 733 etc.) should not be appearing in the 3rd > line of output.  The third line of output should be missing 731 thru 736. Well then look at this for (i in 731:732) {  SEQ <- (i - 5):(i + 5)  print(SEQ)  SEQ <- SEQ[SEQ > 730 & SEQ < 1096]  print(SEQ)  print((731:1095)[-(-730+SEQ)])  # my modification } # [1] 726 727 728 729 730 731 732 733 734 735 736 # [1] 731 732 733 734 735 736 # [1]  737  738  739  740  741  742  743  744  745  746  747  748  749  750  751 which seems to give the desired output > Any suggestions on how to modify the R code are certainly welcome. > Suggested revisions will be substituted back into the third FOR loop in my > original post on this thread to prevent the main- and near-main-diagonal > terms from being set equal to zero. > > for (i in 731:732) { >  SEQ <- (i - 5):(i + 5) >  print(SEQ) >  SEQ <- SEQ[SEQ > 730 & SEQ < 1096] >  print(SEQ) >  print((731:1095)[-SEQ]) > } > > # [1] 726 727 728 729 730 731 732 733 734 735 736 > # [1] 731 732 733 734 735 736 > # [1]  731  732  733  734  735  736  737  738  739  740  741  742  743  744 > 745  746  747  748  749  750  751  752  753  754  755  756... > > > > > -- > View this message in context: http://r.789695.n4.nabble.com/setting-off-diagonals-to-zero-tp4656407p4656461.html> Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > [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> and provide commented, minimal, self-contained, reproducible code. ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.