Hi, I have a 7000x7000 matrix, and each element is an integer. For each element, I want to apply the function : wt <- 0 for(q in 1:count){ wt <- wt + 0.5^(q-1) } I get the value of 'count' from the elements in the matrix , and want to store the corresponding 'wt' value for that element. I suppose I could loop through the matrix, and apply the function to each element but this would take a really really long time. Are there any quicker ways to get the same result? many thanks, Tim --------------------------------- [[alternative HTML version deleted]]
Tuszynski, Jaroslaw W.
2005-Oct-07 19:17 UTC
[R] Applying a function to each element of an array
I suspect that loop would be the fastest since it would have the least memory overhead. You do not want to have too many internal copies of 7000x7000 matrices. Jarek ====================================================\==== Jarek Tuszynski, PhD. o / \ Science Applications International Corporation <\__,| (703) 676-4192 "> \ Jaroslaw.W.Tuszynski at saic.com ` \ -----Original Message----- From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Tim Smith Sent: Friday, October 07, 2005 2:48 PM To: r-help at stat.math.ethz.ch Subject: [R] Applying a function to each element of an array Hi, I have a 7000x7000 matrix, and each element is an integer. For each element, I want to apply the function : wt <- 0 for(q in 1:count){ wt <- wt + 0.5^(q-1) } I get the value of 'count' from the elements in the matrix , and want to store the corresponding 'wt' value for that element. I suppose I could loop through the matrix, and apply the function to each element but this would take a really really long time. Are there any quicker ways to get the same result? many thanks, Tim --------------------------------- [[alternative HTML version deleted]] ______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Well, since Sum(i=1 to i-n) =n*(n+1)/2, your loop simply gives 1/4*count*(count-1). So if your matrix is A, A*(A-1)/4 is about the quickest way to get your answer I think. -- Bert Gunter Genentech Non-Clinical Statistics South San Francisco, CA "The business of the statistician is to catalyze the scientific learning process." - George E. P. Box> -----Original Message----- > From: r-help-bounces at stat.math.ethz.ch > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Tim Smith > Sent: Friday, October 07, 2005 11:48 AM > To: r-help at stat.math.ethz.ch > Subject: [R] Applying a function to each element of an array > > Hi, > > I have a 7000x7000 matrix, and each element is an integer. > For each element, I want to apply the function : > > wt <- 0 > for(q in 1:count){ > wt <- wt + 0.5^(q-1) > } > > I get the value of 'count' from the elements in the matrix , > and want to store the corresponding 'wt' value for that element. > > I suppose I could loop through the matrix, and apply the > function to each element but this would take a really really > long time. Are there any quicker ways to get the same result? > > many thanks, > > Tim > > > --------------------------------- > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html >
Kjetil Holuerson
2005-Oct-07 19:24 UTC
[R] Applying a function to each element of an array
Tim Smith wrote:> Hi, > > I have a 7000x7000 matrix, and each element is an integer. For each element, I want to apply the function : > > wt <- 0 > for(q in 1:count){ > wt <- wt + 0.5^(q-1) > } >This is not a function! Maybe you want helper <- function(count) sum(0.5^((1:count)-1))> I get the value of 'count' from the elements in the matrix , and want to store the corresponding 'wt' value for that element. > > I suppose I could loop through the matrix, and apply the function to each element but this would take a really really long time. Are there any quicker ways to get the same result? > > many thanks,mapply(helper, yourmat) gives you the elements of the matrix, as a vector. So you only must reassemble as a matrix: n <- nrow(yourmat) p <- ncol(yourmat) matrix( mapply(helper, yourmat), n, p) Kjetil> > Tim > > > --------------------------------- > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html > >--
Prof Brian Ripley
2005-Oct-07 19:28 UTC
[R] Applying a function to each element of an array
If A is the matrix the answer is 2*(1 - 2^(-A)), which took about 10secs for an example of your size.>From \sum_{i=1}^n x^{1-i} = (1-x^{-n})/(1-x), E & OE.On Fri, 7 Oct 2005, Tim Smith wrote:> I have a 7000x7000 matrix, and each element is an integer. For each > element, I want to apply the function : > > wt <- 0 > for(q in 1:count){ > wt <- wt + 0.5^(q-1) > } > > I get the value of 'count' from the elements in the matrix , and want to > store the corresponding 'wt' value for that element. > > I suppose I could loop through the matrix, and apply the function to > each element but this would take a really really long time. Are there > any quicker ways to get the same result?-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
Oops -- quite right, Brian. Interesting, as I stared at it for some time. Sigh... now what **WAS** I looking for in the refrigerator? -- Bert Gunter Genentech Non-Clinical Statistics South San Francisco, CA> -----Original Message----- > From: Prof Brian Ripley [mailto:ripley at stats.ox.ac.uk] > Sent: Friday, October 07, 2005 12:36 PM > To: Berton Gunter > Cc: 'Tim Smith' > Subject: Re: [R] Applying a function to each element of an array > > On Fri, 7 Oct 2005, Berton Gunter wrote: > > > Well, since Sum(i=1 to i-n) =n*(n+1)/2, your loop simply gives > > 1/4*count*(count-1). > > So if your matrix is A, A*(A-1)/4 is about the quickest way > to get your > > answer I think. > > I think Bert has read ^ as *. > > > > > -- Bert Gunter > > Genentech Non-Clinical Statistics > > South San Francisco, CA > > > > "The business of the statistician is to catalyze the > scientific learning > > process." - George E. P. Box > > > > > > > >> -----Original Message----- > >> From: r-help-bounces at stat.math.ethz.ch > >> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Tim Smith > >> Sent: Friday, October 07, 2005 11:48 AM > >> To: r-help at stat.math.ethz.ch > >> Subject: [R] Applying a function to each element of an array > >> > >> Hi, > >> > >> I have a 7000x7000 matrix, and each element is an integer. > >> For each element, I want to apply the function : > >> > >> wt <- 0 > >> for(q in 1:count){ > >> wt <- wt + 0.5^(q-1) > >> } > >> > >> I get the value of 'count' from the elements in the matrix , > >> and want to store the corresponding 'wt' value for that element. > >> > >> I suppose I could loop through the matrix, and apply the > >> function to each element but this would take a really really > >> long time. Are there any quicker ways to get the same result? > >> > >> many thanks, > >> > >> Tim > >> > >> > >> --------------------------------- > >> > >> > >> [[alternative HTML version deleted]] > >> > >> ______________________________________________ > >> R-help at stat.math.ethz.ch mailing list > >> https://stat.ethz.ch/mailman/listinfo/r-help > >> PLEASE do read the posting guide! > >> http://www.R-project.org/posting-guide.html > >> > > > > ______________________________________________ > > R-help at stat.math.ethz.ch mailing list > > https://stat.ethz.ch/mailman/listinfo/r-help > > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html > > > > -- > Brian D. Ripley, ripley at stats.ox.ac.uk > Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ > University of Oxford, Tel: +44 1865 272861 (self) > 1 South Parks Road, +44 1865 272866 (PA) > Oxford OX1 3TG, UK Fax: +44 1865 272595 >
If there weren't an analytic solution to your problem, then you could build a vector of the answers from 1 to the maximum in the matrix. Call that 'wtvec'. Then: ans <- array(NA, dim(A), dimnames(A)) ans[] <- wtvec[as.vector(A)] should get you what you want. Patrick Burns patrick at burns-stat.com +44 (0)20 8525 0696 http://www.burns-stat.com (home of S Poetry and "A Guide for the Unwilling S User") Tim Smith wrote:>Hi, > >I have a 7000x7000 matrix, and each element is an integer. For each element, I want to apply the function : > >wt <- 0 > for(q in 1:count){ > wt <- wt + 0.5^(q-1) >} > >I get the value of 'count' from the elements in the matrix , and want to store the corresponding 'wt' value for that element. > >I suppose I could loop through the matrix, and apply the function to each element but this would take a really really long time. Are there any quicker ways to get the same result? > >many thanks, > >Tim > > >--------------------------------- > > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html > > > > >