/** * Interpolates the current uniform samples as real numbers. * @param nx the number of output samples. * @param x array[nx] of values x at which to interpolate y(x). * @param y array[nx] of interpolated output y(x). */ public void interpolate(int nx, float[] x, float[] y) { for (int ix=0; ix<nx; ++ix) y[ix] = interpolate(x[ix]); }
/** * Sets the current sampling and samples for a function y(x). * This method simply calls the two methods * {@link #setUniformSampling(int,double,double)} and * {@link #setUniformSamples(float[])} * with the specified parameters. * @param nxu the number of uniform samples. * @param dxu the uniform sampling interval. * @param fxu the value x corresponding to the first uniform sample yu[0]. * @param yu array[nxu] of uniform samples of y(x); * by reference, not by copy. */ public void setUniform(int nxu, double dxu, double fxu, float[] yu) { setUniformSampling(nxu,dxu,fxu); setUniformSamples(yu); }
public void testInterpolator1Zero() { float[] yu = {1.0f}; LinearInterpolator li = new LinearInterpolator(); li.setExtrapolation(LinearInterpolator.Extrapolation.ZERO); li.setUniform(1,2.0,0.0,yu); assertEquals(0.0f,li.interpolate(-2.0),0.0); assertEquals(0.5f,li.interpolate(-1.0),0.0); assertEquals(1.0f,li.interpolate( 0.0),0.0); assertEquals(0.5f,li.interpolate( 1.0),0.0); assertEquals(0.0f,li.interpolate( 2.0),0.0); }
public void testInterpolator2Zero() { float[][] yu = {{1.0f}}; LinearInterpolator li = new LinearInterpolator(); li.setExtrapolation(LinearInterpolator.Extrapolation.ZERO); li.setUniform(1,2.0,0.0,1,1.0,0.0,yu); assertEquals(0.0f,li.interpolate(-2.0, 0.0),0.0); assertEquals(0.5f,li.interpolate(-1.0, 0.0),0.0); assertEquals(1.0f,li.interpolate( 0.0, 0.0),0.0); assertEquals(0.5f,li.interpolate( 1.0, 0.0),0.0); assertEquals(0.0f,li.interpolate( 2.0, 0.0),0.0); assertEquals(0.0f,li.interpolate( 0.0,-1.0),0.0); assertEquals(0.5f,li.interpolate( 0.0,-0.5),0.0); assertEquals(1.0f,li.interpolate( 0.0, 0.0),0.0); assertEquals(0.5f,li.interpolate( 0.0, 0.5),0.0); assertEquals(0.0f,li.interpolate( 0.0, 1.0),0.0); }
public void testInterpolator3Zero() { float[][][] yu = {{{1.0f}}}; LinearInterpolator li = new LinearInterpolator(); li.setExtrapolation(LinearInterpolator.Extrapolation.ZERO); li.setUniform(1,2.0,0.0,1,1.0,0.0,1,4.0,0.0,yu); assertEquals(0.0f,li.interpolate(-2.0, 0.0, 0.0),0.0); assertEquals(0.5f,li.interpolate(-1.0, 0.0, 0.0),0.0); assertEquals(1.0f,li.interpolate( 0.0, 0.0, 0.0),0.0); assertEquals(0.5f,li.interpolate( 1.0, 0.0, 0.0),0.0); assertEquals(0.0f,li.interpolate( 2.0, 0.0, 0.0),0.0); assertEquals(0.0f,li.interpolate( 0.0,-1.0, 0.0),0.0); assertEquals(0.5f,li.interpolate( 0.0,-0.5, 0.0),0.0); assertEquals(1.0f,li.interpolate( 0.0, 0.0, 0.0),0.0); assertEquals(0.5f,li.interpolate( 0.0, 0.5, 0.0),0.0); assertEquals(0.0f,li.interpolate( 0.0, 1.0, 0.0),0.0); assertEquals(0.0f,li.interpolate( 0.0, 0.0,-4.0),0.0); assertEquals(0.5f,li.interpolate( 0.0, 0.0,-2.0),0.0); assertEquals(1.0f,li.interpolate( 0.0, 0.0, 0.0),0.0); assertEquals(0.5f,li.interpolate( 0.0, 0.0, 2.0),0.0); assertEquals(0.0f,li.interpolate( 0.0, 0.0, 4.0),0.0); }
/** * Sets the current sampling and samples for a function y(x1,x2). * This method simply calls the two methods * {@link #setUniformSampling(int,double,double,int,double,double)} and * {@link #setUniformSamples(float[][])} * with the specified parameters. * @param nx1u the number of uniform samples in 1st dimension. * @param dx1u the uniform sampling interval in 1st dimension. * @param fx1u the value x1 correponding to the first sample yu[0][0]. * @param nx2u the number of uniform samples in 2nd dimension. * @param dx2u the uniform sampling interval in 2nd dimension. * @param fx2u the value x2 correponding to the first sample yu[0][0]. * @param yu array[nx2u][nx1u] of samples of y(x1,x2); * by reference, not by copy. */ public void setUniform( int nx1u, double dx1u, double fx1u, int nx2u, double dx2u, double fx2u, float[][] yu) { setUniformSampling(nx1u,dx1u,fx1u,nx2u,dx2u,fx2u); setUniformSamples(yu); }
/** * Interpolates the current uniform samples as real numbers. * <p> * This method does not perform any anti-alias filtering, which may or * may not be necessary to avoid aliasing when the specified output * sampling interval exceeds the current uniform sampling interval. * @param nx the number of output samples. * @param dx the output sampling interval. * @param fx the value x corresponding to the first output sample y[0]. * @param y array[nx] of interpolated output y(x). */ public void interpolate(int nx, double dx, double fx, float[] y) { for (int ix=0; ix<nx; ++ix) y[ix] = interpolate(fx+ix*dx); }
public void testInterpolator1() { int nxu = 100; float dxu = 0.3f; float fxu = 3.3f; float xmin = fxu; float xmax = fxu+(nxu-1)*dxu; float[] yu = new float[nxu]; for (int ixu=0; ixu<nxu; ++ixu) yu[ixu] = ramp(fxu+ixu*dxu); LinearInterpolator li = new LinearInterpolator(); li.setExtrapolation(LinearInterpolator.Extrapolation.CONSTANT); li.setUniform(nxu,dxu,fxu,yu); int nx = 500; float dx = 1.02f*(xmax-xmin)/(nx-1); float fx = xmin-2.3f*dx; for (int ix=0; ix<nx; ++ix) { float x = fx+ix*dx; float yi = li.interpolate(x); float c = max(xmin,min(xmax,x)); float yr = ramp(c); assertEquals(yi,yr,yr*0.00001f); } }
/** * Sets the current sampling and samples for a function y(x1,x2,x3). * This method simply calls the two methods * {@link #setUniformSampling( * int,double,double,int,double,double,int,double,double)} and * {@link #setUniformSamples(float[][][])} * with the specified parameters. * @param nx1u the number of uniform samples in 1st dimension. * @param dx1u the uniform sampling interval in 1st dimension. * @param fx1u the value x1 correponding to the first sample yu[0][0][0]. * @param nx2u the number of uniform samples in 2nd dimension. * @param dx2u the uniform sampling interval in 2nd dimension. * @param fx2u the value x2 correponding to the first sample yu[0][0][0]. * @param nx3u the number of uniform samples in 3rd dimension. * @param dx3u the uniform sampling interval in 3rd dimension. * @param fx3u the value x3 correponding to the first sample yu[0][0][0]. * @param yu array[nx3u][nx2u][nx1u] of samples of y(x1,x2,x3); * by reference, not by copy. */ public void setUniform( int nx1u, double dx1u, double fx1u, int nx2u, double dx2u, double fx2u, int nx3u, double dx3u, double fx3u, float[][][] yu) { setUniformSampling(nx1u,dx1u,fx1u,nx2u,dx2u,fx2u,nx3u,dx3u,fx3u); setUniformSamples(yu); }
public void testInterpolator2() { int nx1u = 100, nx2u = 200; float dx1u = 0.3f, dx2u = 0.4f; float fx1u = 3.3f, fx2u = 4.3f; float x1min = fx1u, x1max = fx1u+(nx1u-1)*dx1u; float x2min = fx2u, x2max = fx2u+(nx2u-1)*dx2u; float[][] yu = new float[nx2u][nx1u]; for (int ix2u=0; ix2u<nx2u; ++ix2u) for (int ix1u=0; ix1u<nx1u; ++ix1u) yu[ix2u][ix1u] = ramp(fx1u+ix1u*dx1u,fx2u+ix2u*dx2u); LinearInterpolator li = new LinearInterpolator(); li.setExtrapolation(LinearInterpolator.Extrapolation.CONSTANT); li.setUniform(nx1u,dx1u,fx1u,nx2u,dx2u,fx2u,yu); int nx1 = 300, nx2 = 400; float dx1 = 1.02f*(x1max-x1min)/(nx1-1); float dx2 = 1.01f*(x2max-x2min)/(nx2-1); float fx1 = x1min-3.9f*dx1, fx2 = x2min-4.1f*dx2; for (int ix2=0; ix2<nx2; ++ix2) { float x2 = fx2+ix2*dx2; float c2 = max(x2min,min(x2max,x2)); for (int ix1=0; ix1<nx1; ++ix1) { float x1 = fx1+ix1*dx1; float yi = li.interpolate(x1,x2); float c1 = max(x1min,min(x1max,x1)); float yr = ramp(c1,c2); assertEquals(yi,yr,yr*0.00001f); } } }
yu[ix3u][ix2u][ix1u] = ramp(fx1u+ix1u*dx1u,fx2u+ix2u*dx2u,fx3u+ix3u*dx3u); LinearInterpolator li = new LinearInterpolator(); li.setExtrapolation(LinearInterpolator.Extrapolation.CONSTANT); li.setUniform(nx1u,dx1u,fx1u,nx2u,dx2u,fx2u,nx3u,dx3u,fx3u,yu); int nx1 = 30, nx2 = 40, nx3 = 20; float dx1 = 1.1f*(x1max-x1min)/(nx1-1); float x1 = fx1+ix1*dx1; float c1 = max(x1min,min(x1max,x1)); float yi = li.interpolate(x1,x2,x3); float yr = ramp(c1,c2,c3); assertEquals(yi,yr,yr*0.00001f);