[R] Optimizing C code

Duncan Murdoch murdoch at stats.uwo.ca
Fri Jan 22 12:34:52 CET 2010


Christophe Genolini wrote:
> Hi the list,
>
> I need to write some efficient distances function, so I read the code 
> for the Euclidean distance.
> I do not understand the purpose of the line 11 : if x[i] and y[i] are 
> not NA (line 9), can dev be NA ?
>   

As Romain said, the test is for NaN as well as NA.  One way it could 
happen is if both x[i] and y[i] were infinite:  then the difference is NaN:

 > Inf - Inf
[1] NaN

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