StreamGauss getStreamGauss(int convolve) { int i; StreamGauss sg; real* qgaus_X; qgaus_X = (real*) mwMallocA(sizeof(real) * convolve); sg.qgaus_W = (real*) mwMallocA(sizeof(real) * convolve); gaussLegendre(-1.0, 1.0, qgaus_X, sg.qgaus_W, convolve); sg.dx = (real*) mwMallocA(sizeof(real) * convolve); /*Using old (single-sided gaussian stdev = 0.6) to spread points. This is a small simplification when using modfit, but does not cause any problems since it is parameter independent. The weights will be calculated later based on the two-sided gaussian.*/ for (i = 0; i < convolve; ++i) { sg.dx[i] = 3.0 * stdev * qgaus_X[i]; } mwFreeA(qgaus_X); return sg; }
StreamGauss getStreamGauss(const unsigned int convolve) { unsigned int i; StreamGauss sg; real* qgaus_X; qgaus_X = (real*) mwMallocA(sizeof(real) * convolve); sg.qgaus_W = (real*) mwMallocA(sizeof(real) * convolve); gaussLegendre(-1.0, 1.0, qgaus_X, sg.qgaus_W, convolve); sg.dx = (real*) mwMallocA(sizeof(real) * convolve); for (i = 0; i < convolve; ++i) sg.dx[i] = 3.0 * stdev * qgaus_X[i]; mwFreeA(qgaus_X); #ifdef ANDROID sg.dx_intfp = (IntFp*) mwMallocA(sizeof(IntFp) * convolve); for (int i=0; i < convolve; i++) fp_to_intfp(sg.dx[i],&sg.dx_intfp[i]); #endif return sg; }
void test04_gaussLegendre_even() { Float nodes[4], weights[4]; gaussLegendre(4, nodes, weights); assertEqualsEpsilon(nodes[0], (Float) (-1/35.0 * std::sqrt(525+70*std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(nodes[1], (Float) (-1/35.0 * std::sqrt(525-70*std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(nodes[2], (Float) ( 1/35.0 * std::sqrt(525-70*std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(nodes[3], (Float) ( 1/35.0 * std::sqrt(525+70*std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(weights[0], (Float) (1.0/36.0 * (18-std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(weights[1], (Float) (1.0/36.0 * (18+std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(weights[2], (Float) (1.0/36.0 * (18+std::sqrt(30.0))), 1e-8f); assertEqualsEpsilon(weights[3], (Float) (1.0/36.0 * (18-std::sqrt(30.0))), 1e-8f); }
void test05_gaussLegendre_odd() { Float nodes[5], weights[5]; gaussLegendre(5, nodes, weights); assertEqualsEpsilon(nodes[0], (Float) (-1/21.0 * std::sqrt(245+14*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(nodes[1], (Float) (-1/21.0 * std::sqrt(245-14*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(nodes[2], 0.0, 1e-8f); assertEqualsEpsilon(nodes[3], (Float) ( 1/21.0 * std::sqrt(245-14*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(nodes[4], (Float) ( 1/21.0 * std::sqrt(245+14*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(weights[0], (Float) (1.0/900.0 * (322-13*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(weights[1], (Float) (1.0/900.0 * (322+13*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(weights[2], (Float) 128.0/225.0, 1e-8f); assertEqualsEpsilon(weights[3], (Float) (1.0/900.0 * (322+13*std::sqrt(70.0))), 1e-8f); assertEqualsEpsilon(weights[4], (Float) (1.0/900.0 * (322-13*std::sqrt(70.0))), 1e-8f); }