Mercurial > forge
changeset 5704:15b7cc75ac99 octave-forge
some cleanup, and minor improvement
author | schloegl |
---|---|
date | Wed, 03 Jun 2009 20:28:12 +0000 |
parents | e171ffc7b843 |
children | e8212bb6fd61 |
files | extra/NaN/src/covm_mex.cpp |
diffstat | 1 files changed, 66 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/extra/NaN/src/covm_mex.cpp Wed Jun 03 08:00:07 2009 +0000 +++ b/extra/NaN/src/covm_mex.cpp Wed Jun 03 20:28:12 2009 +0000 @@ -27,8 +27,8 @@ // - W: weight vector to compute weighted correlation // // Output: -// - CC = X' * Y while NaN's are skipped -// - NN count of valid (non-NaN) elements +// - CC = X' * diag(W) * Y while NaN's are skipped +// - NN = real(~isnan(X))*diag(W)*real(~isnan(Y)) count of valid (non-NaN) elements // // $Id$ // Copyright (C) 2009 Alois Schloegl <a.schloegl@ieee.org> @@ -142,8 +142,8 @@ */ for (k=0; k<rX; k++) { double w; - if (W) w = W[k]; - else w = 1.0; + if (W) { + w = W[k]; for (i=0; i<cX; i++) { double x = X0[k+i*rX]; if (isnan(x)) { @@ -165,6 +165,28 @@ NN[i+j*cX] += w; } } + } + else for (i=0; i<cX; i++) { + double x = X0[k+i*rX]; + if (isnan(x)) { +#ifndef NO_FLAG + flag_isNaN = 1; +#endif + continue; + } + for (j=0; j<cY; j++) { + double y = Y0[k+j*rY]; + if (isnan(y)) { +#ifndef NO_FLAG + flag_isNaN = 1; +#endif + continue; + } + CC[i+j*cX] += x*y; + if (NN != NULL) + NN[i+j*cX] += 1.0; + } + } } #else @@ -178,21 +200,18 @@ for (j=0; j<cY; j++) { X = X0+i*rX; Y = Y0+j*rY; - register double cc=0.0; - register double nn=0.0; + double cc=0.0; + double nn=0.0; for (k=0; k<rX; k++) { - double x = X[k]; - double y = Y[k]; - - if (!isnan(x) && !isnan(y)) - { - cc += x*y*W[k]; - nn += W[k]; + double z = X[k]*Y[k]; + if (isnan(z)) { +#ifndef NO_FLAG + flag_isNaN = 1; +#endif + continue; } -#ifndef NO_FLAG - else - flag_isNaN = 1; -#endif + cc += z*W[k]; + nn += W[k]; } CC[i+j*cX] = cc; if (NN != NULL) @@ -203,21 +222,18 @@ for (j=0; j<cY; j++) { X = X0+i*rX; Y = Y0+j*rY; - register double cc=0.0; - register size_t nn=0; + double cc=0.0; + size_t nn=0; for (k=0; k<rX; k++) { - double x = X[k]; - double y = Y[k]; - - if (!isnan(x) && !isnan(y)) - { - cc += x*y; - nn++; + double z = X[k]*Y[k]; + if (isnan(z)) { +#ifndef NO_FLAG + flag_isNaN = 1; +#endif + continue; } -#ifndef NO_FLAG - else - flag_isNaN = 1; -#endif + cc += z; + nn++; } CC[i+j*cX] = cc; if (NN != NULL) @@ -230,21 +246,18 @@ for (j=i; j<cY; j++) { X = X0+i*rX; Y = Y0+j*rY; - register double cc=0.0; - register double nn=0.0; + double cc=0.0; + double nn=0.0; for (k=0; k<rX; k++) { - double x = X[k]; - double y = Y[k]; - - if (!isnan(x) && !isnan(y)) - { - cc += x*y*W[k]; - nn += W[k]; + double z = X[k]*Y[k]; + if (isnan(z)) { +#ifndef NO_FLAG + flag_isNaN = 1; +#endif + continue; } -#ifndef NO_FLAG - else - flag_isNaN = 1; -#endif + cc += z*W[k]; + nn += W[k]; } CC[i+j*cX] = cc; CC[j+i*cX] = cc; @@ -258,21 +271,18 @@ for (j=i; j<cY; j++) { X = X0+i*rX; Y = Y0+j*rY; - register double cc=0.0; - register size_t nn=0; + double cc=0.0; + size_t nn=0; for (k=0; k<rX; k++) { - double x = X[k]; - double y = Y[k]; - - if (!isnan(x) && !isnan(y)) - { - cc += x*y; - nn++; + double z = X[k]*Y[k]; + if (isnan(z)) { +#ifndef NO_FLAG + flag_isNaN = 1; +#endif + continue; } -#ifndef NO_FLAG - else - flag_isNaN = 1; -#endif + cc += z; + nn++; } CC[i+j*cX] = cc; CC[j+i*cX] = cc;