[R] Optimizing C code

Duncan Murdoch murdoch at stats.uwo.ca
Fri Jan 22 19:36:12 CET 2010


On 22/01/2010 12:52 PM, Christophe Genolini wrote:
> Thanks both of you.
>
> >
> > > Inf - Inf
> > [1] NaN
> So isn't the line 9 useless ? If either x[i] or y[i] are NA, then dev 
> will be NA and !ISNAN(dev) will detect it...
> Sothe loop cool be
>
> 8.    for(i = 0 ; i < taille ; i++) {
> 10.        dev = (x[i] - y[i]);
> 11.        if(!ISNAN(dev)) {
> 12.          dist += dev * dev;
> 13.          count++;
> 15.      }
> 16. }
>
> No ?
>   

That would presumably give the same answer, but there are lots of 
reasons it might not be useless:

 - the author might find it clearer, or easier to generalize to integer 
data (where your version wouldn't work).
 - it might be faster, because it can abort sooner.
 - it might be essentially equivalent in all important respects.

Duncan Murdoch

> Christophe
> > Duncan Murdoch
> >> Christophe
> >>
> >>
> >> #define both_FINITE(a,b) (R_FINITE(a) && R_FINITE(b))
> >> #define both_non_NA(a,b) (!ISNAN(a) && !ISNAN(b))
> >>
> >> 1. static double R_euclidean2(double *x, double *y, int taille)
> >> 2. {
> >> 3.    double dev, dist;
> >> 4.    int count, i;
> >> 5.
> >> 6.    count= 0;
> >> 7.    dist = 0;
> >> 8.    for(i = 0 ; i < taille ; i++) {
> >> 9.    if(both_non_NA(x[i], y[i])) {
> >> 10.        dev = (x[i] - y[i]);
> >> 11.        if(!ISNAN(dev)) {
> >> 12.        dist += dev * dev;
> >> 13.        count++;
> >> 14.        }
> >> 15.    }
> >> 16.    }
> >> 17.    if(count == 0)return NA_REAL;
> >> 18.    if(count != taille) dist /= ((double)count/taille);
> >> 19.    return sqrt(dist);
> >> 20.}
> >>
> >> ______________________________________________
> >> 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