Mercurial > forge
comparison extra/NaN/src/covm_mex.cpp @ 12691:6d6285a2a633 octave-forge
use macro ISNAN() instead of C++'s isnan() - because it supports all floating point formats not just double
author | schloegl |
---|---|
date | Sat, 12 Sep 2015 14:16:39 +0000 |
parents | f26b1170ea90 |
children | 79e7259c6ff1 |
comparison
equal
deleted
inserted
replaced
12690:16bc2657b1f1 | 12691:6d6285a2a633 |
---|---|
27 // - flag: if not empty, it is set to 1 if some NaN was observed | 27 // - flag: if not empty, it is set to 1 if some NaN was observed |
28 // - W: weight vector to compute weighted correlation | 28 // - W: weight vector to compute weighted correlation |
29 // | 29 // |
30 // Output: | 30 // Output: |
31 // - CC = X' * sparse(diag(W)) * Y while NaN's are skipped | 31 // - CC = X' * sparse(diag(W)) * Y while NaN's are skipped |
32 // - NN = real(~isnan(X)')*sparse(diag(W))*real(~isnan(Y)) count of valid (non-NaN) elements | 32 // - NN = real(~ISNAN(X)')*sparse(diag(W))*real(~ISNAN(Y)) count of valid (non-NaN) elements |
33 // computed more efficiently | 33 // computed more efficiently |
34 // | 34 // |
35 // $Id$ | 35 // $Id$ |
36 // Copyright (C) 2009,2010,2011 Alois Schloegl <alois.schloegl@gmail.com> | 36 // Copyright (C) 2009,2010,2011 Alois Schloegl <alois.schloegl@gmail.com> |
37 // This function is part of the NaN-toolbox | 37 // This function is part of the NaN-toolbox |
46 #include <math.h> | 46 #include <math.h> |
47 #include "mex.h" | 47 #include "mex.h" |
48 | 48 |
49 /*#define NO_FLAG*/ | 49 /*#define NO_FLAG*/ |
50 | 50 |
51 /* | |
52 math.h has isnan() defined for all sizes of floating point numbers, | |
53 but c++ assumes isnan(double), causing possible conversions for float and long double | |
54 */ | |
55 #define ISNAN(a) (a!=a) | |
51 | 56 |
52 void mexFunction(int POutputCount, mxArray* POutput[], int PInputCount, const mxArray *PInputs[]) | 57 void mexFunction(int POutputCount, mxArray* POutput[], int PInputCount, const mxArray *PInputs[]) |
53 { | 58 { |
54 double *X0=NULL, *Y0=NULL, *W=NULL; | 59 double *X0=NULL, *Y0=NULL, *W=NULL; |
55 double *CC; | 60 double *CC; |
161 double w; | 166 double w; |
162 if (W) { | 167 if (W) { |
163 w = W[k]; | 168 w = W[k]; |
164 for (i=0; i<cX; i++) { | 169 for (i=0; i<cX; i++) { |
165 double x = X0[k+i*rX]; | 170 double x = X0[k+i*rX]; |
166 if (isnan(x)) { | 171 if (ISNAN(x)) { |
167 #ifndef NO_FLAG | 172 #ifndef NO_FLAG |
168 flag_isNaN = 1; | 173 flag_isNaN = 1; |
169 #endif | 174 #endif |
170 continue; | 175 continue; |
171 } | 176 } |
172 for (j=0; j<cY; j++) { | 177 for (j=0; j<cY; j++) { |
173 double y = Y0[k+j*rY]; | 178 double y = Y0[k+j*rY]; |
174 if (isnan(y)) { | 179 if (ISNAN(y)) { |
175 #ifndef NO_FLAG | 180 #ifndef NO_FLAG |
176 flag_isNaN = 1; | 181 flag_isNaN = 1; |
177 #endif | 182 #endif |
178 continue; | 183 continue; |
179 } | 184 } |
183 } | 188 } |
184 } | 189 } |
185 } | 190 } |
186 else for (i=0; i<cX; i++) { | 191 else for (i=0; i<cX; i++) { |
187 double x = X0[k+i*rX]; | 192 double x = X0[k+i*rX]; |
188 if (isnan(x)) { | 193 if (ISNAN(x)) { |
189 #ifndef NO_FLAG | 194 #ifndef NO_FLAG |
190 flag_isNaN = 1; | 195 flag_isNaN = 1; |
191 #endif | 196 #endif |
192 continue; | 197 continue; |
193 } | 198 } |
194 for (j=0; j<cY; j++) { | 199 for (j=0; j<cY; j++) { |
195 double y = Y0[k+j*rY]; | 200 double y = Y0[k+j*rY]; |
196 if (isnan(y)) { | 201 if (ISNAN(y)) { |
197 #ifndef NO_FLAG | 202 #ifndef NO_FLAG |
198 flag_isNaN = 1; | 203 flag_isNaN = 1; |
199 #endif | 204 #endif |
200 continue; | 205 continue; |
201 } | 206 } |
228 double cc = 0.0; | 233 double cc = 0.0; |
229 double nw = 0.0; | 234 double nw = 0.0; |
230 size_t k; | 235 size_t k; |
231 for (k=0; k<rX; k++) { | 236 for (k=0; k<rX; k++) { |
232 double z = X[k]*Y[k]; | 237 double z = X[k]*Y[k]; |
233 if (isnan(z)) { | 238 if (ISNAN(z)) { |
234 #ifndef NO_FLAG | 239 #ifndef NO_FLAG |
235 flag_isNaN = 1; | 240 flag_isNaN = 1; |
236 #endif | 241 #endif |
237 continue; | 242 continue; |
238 } | 243 } |
252 double cc = 0.0; | 257 double cc = 0.0; |
253 size_t nn = 0; | 258 size_t nn = 0; |
254 size_t k; | 259 size_t k; |
255 for (k=0; k<rX; k++) { | 260 for (k=0; k<rX; k++) { |
256 double z = X[k]*Y[k]; | 261 double z = X[k]*Y[k]; |
257 if (isnan(z)) { | 262 if (ISNAN(z)) { |
258 #ifndef NO_FLAG | 263 #ifndef NO_FLAG |
259 flag_isNaN = 1; | 264 flag_isNaN = 1; |
260 #endif | 265 #endif |
261 continue; | 266 continue; |
262 } | 267 } |
281 double cc = 0.0; | 286 double cc = 0.0; |
282 double nw = 0.0; | 287 double nw = 0.0; |
283 size_t k; | 288 size_t k; |
284 for (k=0; k<rX; k++) { | 289 for (k=0; k<rX; k++) { |
285 double z = X[k]*Y[k]; | 290 double z = X[k]*Y[k]; |
286 if (isnan(z)) { | 291 if (ISNAN(z)) { |
287 #ifndef NO_FLAG | 292 #ifndef NO_FLAG |
288 flag_isNaN = 1; | 293 flag_isNaN = 1; |
289 #endif | 294 #endif |
290 continue; | 295 continue; |
291 } | 296 } |
312 double cc = 0.0; | 317 double cc = 0.0; |
313 size_t nn = 0; | 318 size_t nn = 0; |
314 size_t k; | 319 size_t k; |
315 for (k=0; k<rX; k++) { | 320 for (k=0; k<rX; k++) { |
316 double z = X[k]*Y[k]; | 321 double z = X[k]*Y[k]; |
317 if (isnan(z)) { | 322 if (ISNAN(z)) { |
318 #ifndef NO_FLAG | 323 #ifndef NO_FLAG |
319 flag_isNaN = 1; | 324 flag_isNaN = 1; |
320 #endif | 325 #endif |
321 continue; | 326 continue; |
322 } | 327 } |
351 long double cc=0.0; | 356 long double cc=0.0; |
352 long double nn=0.0; | 357 long double nn=0.0; |
353 size_t k; | 358 size_t k; |
354 for (k=0; k<rX; k++) { | 359 for (k=0; k<rX; k++) { |
355 long double z = ((long double)X[k])*Y[k]; | 360 long double z = ((long double)X[k])*Y[k]; |
356 if (isnan(z)) { | 361 if (ISNAN(z)) { |
357 #ifndef NO_FLAG | 362 #ifndef NO_FLAG |
358 flag_isNaN = 1; | 363 flag_isNaN = 1; |
359 #endif | 364 #endif |
360 continue; | 365 continue; |
361 } | 366 } |
375 long double cc=0.0; | 380 long double cc=0.0; |
376 size_t nn=0; | 381 size_t nn=0; |
377 size_t k; | 382 size_t k; |
378 for (k=0; k<rX; k++) { | 383 for (k=0; k<rX; k++) { |
379 long double z = ((long double)X[k])*Y[k]; | 384 long double z = ((long double)X[k])*Y[k]; |
380 if (isnan(z)) { | 385 if (ISNAN(z)) { |
381 #ifndef NO_FLAG | 386 #ifndef NO_FLAG |
382 flag_isNaN = 1; | 387 flag_isNaN = 1; |
383 #endif | 388 #endif |
384 continue; | 389 continue; |
385 } | 390 } |
404 long double cc=0.0; | 409 long double cc=0.0; |
405 long double nn=0.0; | 410 long double nn=0.0; |
406 size_t k; | 411 size_t k; |
407 for (k=0; k<rX; k++) { | 412 for (k=0; k<rX; k++) { |
408 long double z = ((long double)X[k])*Y[k]; | 413 long double z = ((long double)X[k])*Y[k]; |
409 if (isnan(z)) { | 414 if (ISNAN(z)) { |
410 #ifndef NO_FLAG | 415 #ifndef NO_FLAG |
411 flag_isNaN = 1; | 416 flag_isNaN = 1; |
412 #endif | 417 #endif |
413 continue; | 418 continue; |
414 } | 419 } |
435 long double cc=0.0; | 440 long double cc=0.0; |
436 size_t nn=0; | 441 size_t nn=0; |
437 size_t k; | 442 size_t k; |
438 for (k=0; k<rX; k++) { | 443 for (k=0; k<rX; k++) { |
439 long double z = ((long double)X[k])*Y[k]; | 444 long double z = ((long double)X[k])*Y[k]; |
440 if (isnan(z)) { | 445 if (ISNAN(z)) { |
441 #ifndef NO_FLAG | 446 #ifndef NO_FLAG |
442 flag_isNaN = 1; | 447 flag_isNaN = 1; |
443 #endif | 448 #endif |
444 continue; | 449 continue; |
445 } | 450 } |
480 long double rn=0.0; | 485 long double rn=0.0; |
481 size_t k; | 486 size_t k; |
482 for (k=0; k<rX; k++) { | 487 for (k=0; k<rX; k++) { |
483 long double t,y; | 488 long double t,y; |
484 long double z = ((long double)X[k])*Y[k]; | 489 long double z = ((long double)X[k])*Y[k]; |
485 if (isnan(z)) { | 490 if (ISNAN(z)) { |
486 #ifndef NO_FLAG | 491 #ifndef NO_FLAG |
487 flag_isNaN = 1; | 492 flag_isNaN = 1; |
488 #endif | 493 #endif |
489 continue; | 494 continue; |
490 } | 495 } |
515 size_t nn=0; | 520 size_t nn=0; |
516 size_t k; | 521 size_t k; |
517 for (k=0; k<rX; k++) { | 522 for (k=0; k<rX; k++) { |
518 long double t,y; | 523 long double t,y; |
519 long double z = ((long double)X[k])*Y[k]; | 524 long double z = ((long double)X[k])*Y[k]; |
520 if (isnan(z)) { | 525 if (ISNAN(z)) { |
521 #ifndef NO_FLAG | 526 #ifndef NO_FLAG |
522 flag_isNaN = 1; | 527 flag_isNaN = 1; |
523 #endif | 528 #endif |
524 continue; | 529 continue; |
525 } | 530 } |
552 long double rn=0.0; | 557 long double rn=0.0; |
553 size_t k; | 558 size_t k; |
554 for (k=0; k<rX; k++) { | 559 for (k=0; k<rX; k++) { |
555 long double t,y; | 560 long double t,y; |
556 long double z = ((long double)X[k])*Y[k]; | 561 long double z = ((long double)X[k])*Y[k]; |
557 if (isnan(z)) { | 562 if (ISNAN(z)) { |
558 #ifndef NO_FLAG | 563 #ifndef NO_FLAG |
559 flag_isNaN = 1; | 564 flag_isNaN = 1; |
560 #endif | 565 #endif |
561 continue; | 566 continue; |
562 } | 567 } |
594 size_t nn=0; | 599 size_t nn=0; |
595 size_t k; | 600 size_t k; |
596 for (k=0; k<rX; k++) { | 601 for (k=0; k<rX; k++) { |
597 long double t,y; | 602 long double t,y; |
598 long double z = ((long double)X[k])*Y[k]; | 603 long double z = ((long double)X[k])*Y[k]; |
599 if (isnan(z)) { | 604 if (ISNAN(z)) { |
600 #ifndef NO_FLAG | 605 #ifndef NO_FLAG |
601 flag_isNaN = 1; | 606 flag_isNaN = 1; |
602 #endif | 607 #endif |
603 continue; | 608 continue; |
604 } | 609 } |
643 double rn=0.0; | 648 double rn=0.0; |
644 size_t k; | 649 size_t k; |
645 for (k=0; k<rX; k++) { | 650 for (k=0; k<rX; k++) { |
646 double t,y; | 651 double t,y; |
647 double z = X[k]*Y[k]; | 652 double z = X[k]*Y[k]; |
648 if (isnan(z)) { | 653 if (ISNAN(z)) { |
649 #ifndef NO_FLAG | 654 #ifndef NO_FLAG |
650 flag_isNaN = 1; | 655 flag_isNaN = 1; |
651 #endif | 656 #endif |
652 continue; | 657 continue; |
653 } | 658 } |
678 size_t nn=0; | 683 size_t nn=0; |
679 size_t k; | 684 size_t k; |
680 for (k=0; k<rX; k++) { | 685 for (k=0; k<rX; k++) { |
681 double t,y; | 686 double t,y; |
682 double z = X[k]*Y[k]; | 687 double z = X[k]*Y[k]; |
683 if (isnan(z)) { | 688 if (ISNAN(z)) { |
684 #ifndef NO_FLAG | 689 #ifndef NO_FLAG |
685 flag_isNaN = 1; | 690 flag_isNaN = 1; |
686 #endif | 691 #endif |
687 continue; | 692 continue; |
688 } | 693 } |
715 double rn=0.0; | 720 double rn=0.0; |
716 size_t k; | 721 size_t k; |
717 for (k=0; k<rX; k++) { | 722 for (k=0; k<rX; k++) { |
718 double t,y; | 723 double t,y; |
719 double z = X[k]*Y[k]; | 724 double z = X[k]*Y[k]; |
720 if (isnan(z)) { | 725 if (ISNAN(z)) { |
721 #ifndef NO_FLAG | 726 #ifndef NO_FLAG |
722 flag_isNaN = 1; | 727 flag_isNaN = 1; |
723 #endif | 728 #endif |
724 continue; | 729 continue; |
725 } | 730 } |
757 size_t nn=0; | 762 size_t nn=0; |
758 size_t k; | 763 size_t k; |
759 for (k=0; k<rX; k++) { | 764 for (k=0; k<rX; k++) { |
760 double t,y; | 765 double t,y; |
761 double z = X[k]*Y[k]; | 766 double z = X[k]*Y[k]; |
762 if (isnan(z)) { | 767 if (ISNAN(z)) { |
763 #ifndef NO_FLAG | 768 #ifndef NO_FLAG |
764 flag_isNaN = 1; | 769 flag_isNaN = 1; |
765 #endif | 770 #endif |
766 continue; | 771 continue; |
767 } | 772 } |