package mikera.vectorz.ops; import mikera.util.Rand; import mikera.vectorz.Op; /** * Operator to add gaussian noise to a value * @author Mike * */ public class GaussianNoise extends Op { private final double std; public static final GaussianNoise UNIT_NOISE=new GaussianNoise(1.0); private GaussianNoise(double stdev) { std=stdev; } public static GaussianNoise create(double stdDev) { return new GaussianNoise(stdDev); } @Override public boolean isStochastic() {return true;} @Override public double apply(double x) { return x+Rand.nextGaussian()*std; } @Override public void applyTo(double[] data, int start,int length) { for (int i=0; i<length; i++) { data[i+start]+=Rand.nextGaussian()*std; } } @Override public boolean hasDerivative() { return true; } @Override public double derivative(double x) { return 1.0; } @Override public double derivativeForOutput(double y) { return 1.0; } @Override public Op getDerivativeOp() { return Constant.ONE; } @Override public double averageValue() { return 0; } }