X-Git-Url: https://git.auder.net/?p=morpheus.git;a=blobdiff_plain;f=pkg%2Fsrc%2Ffunctions.c;h=8731b9f99c6dffccdef2be2521a396fd0b2d9a1c;hp=41065bdc30dea0f4d52ee3d8bda5930fa54cd1a0;hb=d08fef424150599b8095727c0f9870ca9535fb65;hpb=7737c2fa8362b2bf590c2e2f9dcbd75424c51271 diff --git a/pkg/src/functions.c b/pkg/src/functions.c index 41065bd..8731b9f 100644 --- a/pkg/src/functions.c +++ b/pkg/src/functions.c @@ -1,18 +1,18 @@ #include -//index matrix (by columns) +// Index matrix (by columns) int mi(int i, int j, int d1, int d2) { - return j*d1+i; + return j*d1 + i; } -//index 3-tensor (by columns, matrices ordered by last dim) +// Index 3-tensor (by columns, matrices ordered by last dim) int ti(int i, int j, int k, int d1, int d2, int d3) { return k*d1*d2 + j*d1 + i; } -// Emprical cross-moment of order 2 between X size nxd and Y size n +// Empirical cross-moment of order 2 between X size nxd and Y size n void Moments_M2(double* X, double* Y, int* pn, int* pd, double* M2) { int n=*pn, d=*pd; @@ -30,7 +30,7 @@ void Moments_M2(double* X, double* Y, int* pn, int* pd, double* M2) } } -// Emprical cross-moment of order 3 between X size nxd and Y size n +// Empirical cross-moment of order 3 between X size nxd and Y size n void Moments_M3(double* X, double* Y, int* pn, int* pd, double* M3) { int n=*pn, d=*pd; @@ -54,17 +54,49 @@ void Moments_M3(double* X, double* Y, int* pn, int* pd, double* M3) } } +// W = 1/N sum( t(g(Zi,theta)) g(Zi,theta) ) +// with g(Zi, theta) = i-th contribution to all moments (size dim) - real moments void Compute_Omega(double* X, double* Y, double* M, int* pn, int* pd, double* W) { int n=*pn, d=*pd; - //double* W = (double*)calloc(d+d*d+d*d*d,sizeof(double)); - - // TODO: formula 1/N sum( t(g(Zi,theta)) g(Zi,theta) ) - // = 1/N sum( t( (XiYi-...) - M[i] ) ( ... ) ) - // --> similar to Moments_M2 and M3 above - for (int j=0; j< + //int dim = d+d*d+d*d*d + //double* W = (double*)calloc(dim*dim,sizeof(double)); + double* g = (double*)malloc(dim * sizeof(double)); for (int i=0; i