All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jscl.math.operator.stat.StandardDeviation Maven / Gradle / Ivy

There is a newer version: 1.0.11
Show newest version
package jscl.math.operator.stat;

import jscl.math.*;
import jscl.math.function.Sqrt;
import jscl.math.operator.Operator;

import javax.annotation.Nonnull;

/**
 * User: serso
 * Date: 12/26/11
 * Time: 11:09 AM
 */
public class StandardDeviation extends AbstractStatFunction {

	public static final String NAME = "st_dev";

	public StandardDeviation(JsclVector vector) {
		this(new Generic[]{vector});
	}

	private StandardDeviation(@Nonnull Generic[] parameters) {
		super(NAME, parameters);
	}

	@Nonnull
	@Override
	public Operator newInstance(@Nonnull Generic[] parameters) {
		return new StandardDeviation(parameters);
	}

	@Override
	public int getMinParameters() {
		return 1;
	}

	@Override
	public Generic selfExpand() {
		return expressionValue();
	}

	@Override
	public Generic selfNumeric() {
		if (parameters[0] instanceof JsclVector) {
			final JsclVector vector = (JsclVector) parameters[0];
			final Generic[] elements = vector.elements();

			if (elements.length == 0) {
				return new NumericWrapper(JsclInteger.ZERO);
			} else if (elements.length == 1) {
				return new NumericWrapper(JsclInteger.ZERO);
			} else {
				final Generic mean = new Mean(vector).numeric();

				Generic result = new NumericWrapper(JsclInteger.ZERO);
				for (int i = 0; i < elements.length; i++) {
					result = result.add(elements[i].numeric().subtract(mean).pow(2));
				}
				return new Sqrt(result.divide(JsclInteger.valueOf(elements.length).numeric().subtract(JsclInteger.ONE.negate().numeric()))).numeric();
			}
		} else {
			return expressionValue();
		}
	}

	@Nonnull
	@Override
	public Variable newInstance() {
		return new StandardDeviation((JsclVector) null);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy