[R] Computation of contour values - Speeding up computation
Andreas Wittmann
andreas_wittmann at gmx.de
Sat Sep 20 13:59:40 CEST 2008
Thank you very much, yes maybe its worth working on it.
best regards
Andreas
Uwe Ligges wrote:
>
>
> Andreas Wittmann wrote:
>> Dear R useRs,
>> i have the following code to compute values needed for a contour plot
>>
>> ############################################################
>>
>> "myContour" <- function(a, b, plist, veca, vecb, dim)
>> {
>> tmpb <- seq(0.5 * b, 1.5 * b, length=dim)
>> tmpa <- seq(0.5 * a, 1.5 * a, length=dim)
>>
>> z <- matrix(0, nrow=dim, ncol=dim)
>> for(i in 1:dim)
>> {
>> for(j in 1:dim)
>> {
>> z[i, j] <- posteriorPdf(a=tmpa[j], b=tmpb[i],
>> plist=plist, veca=veca, vecb=vecb) }
>> }
>> }
>>
>> "posteriorPdf" <- function(a, b, plist, veca, vecb)
>> {
>> res <- sum(plist[, 1] * exp(vecb[, 1] *
>> log(vecb[, 2]) + (vecb[, 1] - 1.0) * log(b) - vecb[,
>> 2] * b - lgamma(vecb[, 1])) *
>> exp(veca[, 1] * log(veca[, 2]) + (veca[, 1] - 1.0) *
>> log(a) - veca[, 2] * a - lgamma(veca[, 1])))
>> return(res) }
>>
>> plist <- matrix(0, 100, 3)
>> plist[, 1] <- runif(100) veca <- vecb <- matrix(0, 100, 2)
>>
>> veca[, 1] <- seq(20, 50, len=100)
>> veca[, 2] <- seq(10, 20, len=100)
>>
>> vecb[, 1] <- seq(50, 200, len=100)
>> vecb[, 2] <- seq(1000, 400000, len=100)
>>
>> myContour(a=20, b=0.01, plist=plist, veca=veca, vecb=vecb, dim=50)
>>
>> ############################################################
>>
>> this is part of my other computations which i do with R. Here i
>> recognized, that my functions myContour and posteriorPdf took a long
>> time of my computations. The key to speed this up is to avoid the two
>> for-loops in myContour, i think. I tried a lot to do this with apply
>> or something like that, but i didn't get it.
>> If you have any advice how i can to this computations fast, i would
>> be very thankful, one idea is to use external c-code?
>>
>
>
> It takes 0.8 seconds on my machine. Not worth working on it, is it?
>
> Your problem is that you are applying many calculations for all
> iterations of the inner loop, even if the result won't change, example:
> lgamma(veca[, 1]) will be calculated dim^2 times!
>
> Hence you can improve your loop considerably:
>
>
>
> myContour <- function(a, b, plist, veca, vecb, dim)
> {
> tmpb <- seq(0.5 * b, 1.5 * b, length=dim)
> tmpa <- seq(0.5 * a, 1.5 * a, length=dim)
>
> z <- matrix(0, nrow=dim, ncol=dim)
> plist1 <- plist[, 1]
> vecb1l2 <- vecb[, 1] * log(vecb[, 2])
> vecb11 <- vecb[, 1] - 1
> vecb1lg <- lgamma(vecb[, 1])
> vecb2 <- vecb[, 2]
> veca1l2 <- veca[, 1] * log(veca[, 2])
> veca11 <- veca[, 1] - 1
> veca2 <- veca[, 2]
> veca1lg <- lgamma(veca[, 1])
>
> for(i in 1:dim)
> {
> for(j in 1:dim)
> {
> z[i, j] <- sum(plist1 * exp(vecb1l2 + vecb11 * log(tmpb[i]) -
> vecb2 * tmpb[i] - vecb1lg) * exp(veca1l2 + veca11 * log(tmpa[j]) -
> veca2 * tmpa[j] - veca1lg))
> }
> }
> z
> }
>
> Uwe Ligges
>
>
>
>
>
>
>> best regards
>> Andreas --
>>
>> ______________________________________________
>> 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.
>
More information about the R-help
mailing list