[R] For loop
Joshua Wiley
jwiley.psych at gmail.com
Sun Oct 31 22:39:53 CET 2010
Hi,
Using the code below I got almost a 60% speedup. Obviously this is
largely dependent on there being relatively fewer columns than rows.
HTH,
Josh
#############################
## Create data
h <- structure(c(0.25, 0.25, 0, 0, 0, 0, -0.25, -0.25, -0.25, -0.25,
-0.5, -0.5, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
0.25), .Dim = c(1L, 22L), .Dimnames = list(NULL, NULL))
xx <- seq(0, 1, 0.00005)
v <- matrix(nrow=20001,ncol=22)
vv <- matrix(nrow=20001,ncol=22)
## Create duplicates for comparison
h.2 <- h; xx.2 <- xx; v.2 <- v; vv.2 <- vv
## Old
system.time(for (y in 1:20001) {v[y, 22] <- h[1, 22]})
## New
system.time(v.2[, 22] <- h.2[1, 22])
## no speedup possible here
vv[20001,22] <- v[20001,22]
vv.2[20001,22] <- v.2[20001,22]
## Old
system.time(
for(k in 21:1) {
for(j in 20001:2) {
vv[j-1, k + 1] <- min(xx[j-1] * v[j-1,k+1], vv[j,k+1])
v[j, k] <- h[1, k] + vv[j-1, k+1]
}
vv[20001, k] <- v[20001, k]
})
# user system elapsed
# 20.733 0.044 25.869
## New
system.time(for(k in 21:1) {
tmp <- xx.2 * v.2[, k+1]
for(j in 20001:2) {
vv.2[j-1, k + 1] <- min(tmp[j-1], vv.2[j, k+1])
}
v.2[-1, k] <- h.2[1, k] + vv.2[-20001, k+1]
vv.2[20001, k] <- v.2[20001, k]
})
# user system elapsed
# 9.184 0.012 10.500
## Check that new is identical to old
identical(vv, vv.2)
identical(v, v.2)
On Sun, Oct 31, 2010 at 3:58 AM, Astabenefica <astabenefica at hotmail.it> wrote:
> Thanks for the suggestions.
> I add some more detail to clarify:
>
> h=matrix(nrow=1,ncol=22)
>
> In my data h is:
> (0.25 0.25 0 0 0 0 -0.25 -0.25 -0.25 -0.25 -0.5 -0.5 0 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25)
>
>
>
> xx<-seq(0,1,0.00005)
>
> v=matrix(nrow=20001,ncol=22)
> vv=matrix(nrow=20001,ncol=22)
> for (y in 1:20001) {
> v[y,22]=h[1,22]
> }
> vv[20001,22]=v[20001,22]
> for(k in 21:1) {
> for(j in 20001:2) {
> vv[j-1,k+1]=min(xx[j-1]*v[j-1,k+1],vv[j,k+1])
> v[j,k]=h[1,k]+vv[j-1,k+1]
> }
> vv[20001,k]=v[20001,k]
> }
>
>
>
> The idea of using Rcpp seems to be good. Having never used this package will give a look.
> Somewhere I read an example like this:
>
>
> for (i in 1:R) {
> res[i]<-f()
> NULL
> }
>
> where f() is a function, but I don't how can I trasform my code:
> vv[j-1,k+1]=min(xx[j-1]*v[j-1,k+1],vv[j,k+1])
> v[j,k]=h[1,k]+vv[j-1,k+1]
> in a function
>
>
>
>
>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org 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.
>
--
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/
More information about the R-help
mailing list