functions of vectors : loop or vectorization

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

functions of vectors : loop or vectorization

Julien Salanie
I have a read a lot about the benefits of vectorization in R. I have a program that takes "almost forever" to run. A good way to see if I have learned something ... My problem can be summarized like this : I have a nonlinear function of several variables that I want to optimize over one letting the other describe a family of curves. In short, I wan't to optimize f(x,a,b) for several values of a and b.

It is easily done with a loop. Here's an example :

a = 1:5;
b = 1:5;
myfunction = function(x){y*x-(x+z)^2};
myresults = array(dim=c(length(a),length(b)));
for(y in a){ for(z in b) { myresults[y,z] = optimize(myfunction,c(-10,10),maximum=TRUE)$maximum }};
myresults;

[,1] [,2] [,3] [,4] [,5]
[1,] -0.5 -1.5 -2.5 -3.5 -4.5
[2,]  0.0 -1.0 -2.0 -3.0 -4.0
[3,]  0.5 -0.5 -1.5 -2.5 -3.5
[4,]  1.0  0.0 -1.0 -2.0 -3.0
[5,]  1.5  0.5 -0.5 -1.5 -2.5

Of course, my real life problem is a bit more complicated and runs in days ...

I didn't find a straightforward way to do this using the apply family. I did a small script that works. Here it is :

c = 1:5;
d = 1:5;
myfunction2 = function(c,d){optimize(function(x){c*x-(x+d)^2},c(-10,10),maximum=TRUE)$maximum};
v.myfunction2 = Vectorize(myfunction2, c("c","d"));
outer(c, d, v.myfunction2);

all.equal(myresults,outer(c, d, v.myfunction2));
[1] TRUE

I was quite happy with my trick of separating and wrapping the functions until I increased the size of the two input vectors and checked for the processing time. I made no gain. In that case :

> time.elapsed; time.elapsed2;
Time difference of 0.08000016 secs
Time difference of 0.07999992 secs

When I changed the size of the vectors and added a logarithm here and there to complicate a bit, it doesn't change the problem. The two methods perform identically. Am I missing something ? Is there a better way to vectorize the problem to gain time ? How is it that my loop performs as well as "outer" ? Thanks in advance for your help. All the best, Julien
Reply | Threaded
Open this post in threaded view
|

Re: functions of vectors : loop or vectorization

Uwe Ligges-3
On 14.07.2012 00:41, Julien Salanie wrote:

> I have a read a lot about the benefits of vectorization in R. I have a
> program that takes "almost forever" to run. A good way to see if I have
> learned something ... My problem can be summarized like this : I have a
> nonlinear function of several variables that I want to optimize over one
> letting the other describe a family of curves. In short, I wan't to optimize
> f(x,a,b) for several values of a and b.
>
> It is easily done with a loop. Here's an example :
>
> a = 1:5;
> b = 1:5;
> myfunction = function(x){y*x-(x+z)^2};
> myresults = array(dim=c(length(a),length(b)));
> for(y in a){ for(z in b) { myresults[y,z] =
> optimize(myfunction,c(-10,10),maximum=TRUE)$maximum }};
> myresults;
>
> [,1] [,2] [,3] [,4] [,5]
> [1,] -0.5 -1.5 -2.5 -3.5 -4.5
> [2,]  0.0 -1.0 -2.0 -3.0 -4.0
> [3,]  0.5 -0.5 -1.5 -2.5 -3.5
> [4,]  1.0  0.0 -1.0 -2.0 -3.0
> [5,]  1.5  0.5 -0.5 -1.5 -2.5
>
> Of course, my real life problem is a bit more complicated and runs in days
> ...
>
> I didn't find a straightforward way to do this using the apply family. I did
> a small script that works. Here it is :
>
> c = 1:5;
> d = 1:5;
> myfunction2 =
> function(c,d){optimize(function(x){c*x-(x+d)^2},c(-10,10),maximum=TRUE)$maximum};
> v.myfunction2 = Vectorize(myfunction2, c("c","d"));
> outer(c, d, v.myfunction2);
>
> all.equal(myresults,outer(c, d, v.myfunction2));
> [1] TRUE
>
> I was quite happy with my trick of separating and wrapping the functions
> until I increased the size of the two input vectors and checked for the
> processing time. I made no gain. In that case :
>
>> time.elapsed; time.elapsed2;
> Time difference of 0.08000016 secs
> Time difference of 0.07999992 secs
>
> When I changed the size of the vectors and added a logarithm here and there
> to complicate a bit, it doesn't change the problem. The two methods perform
> identically. Am I missing something ? Is there a better way to vectorize the
> problem to gain time ? How is it that my loop performs as well as "outer" ?
> Thanks in advance for your help. All the best, Julien

 From what I understand you can't without loop. Actually, the
Vectorize() call generates a function that calls mapply() which is some
kind of a loop. This may be a case where the transition of inner loops
to C may be benefitial.

Best,
Uwe Ligges






> --
> View this message in context: http://r.789695.n4.nabble.com/functions-of-vectors-loop-or-vectorization-tp4636494.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-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.