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

jscl.math.numeric.Vector Maven / Gradle / Ivy

package jscl.math.numeric;

import jscl.math.NotDivisibleException;
import jscl.util.ArrayComparator;

import javax.annotation.Nonnull;

public class Vector extends Numeric {

	protected final Numeric element[];
	protected final int n;

	public Vector(Numeric element[]) {
		this.element = element;
		n = element.length;
	}

	public Numeric[] elements() {
		return element;
	}

	public Vector add(Vector vector) {
		Vector v = newInstance();
		for (int i = 0; i < n; i++) v.element[i] = element[i].add(vector.element[i]);
		return v;
	}

	@Nonnull
	public Numeric add(@Nonnull Numeric that) {
		if (that instanceof Vector) {
			return add((Vector) that);
		} else {
			return add(valueOf(that));
		}
	}

	public Vector subtract(Vector vector) {
		Vector v = newInstance();
		for (int i = 0; i < n; i++) {
			v.element[i] = element[i].subtract(vector.element[i]);
		}
		return v;
	}

	@Nonnull
	public Numeric subtract(@Nonnull Numeric that) {
		if (that instanceof Vector) {
			return subtract((Vector) that);
		} else {
			return subtract(valueOf(that));
		}
	}

	@Nonnull
	public Numeric multiply(@Nonnull Numeric that) {
		if (that instanceof Vector) {
			return scalarProduct((Vector) that);
		} else if (that instanceof Matrix) {
			return ((Matrix) that).transpose().multiply(this);
		} else {
			Vector v = newInstance();
			for (int i = 0; i < n; i++) v.element[i] = element[i].multiply(that);
			return v;
		}
	}

	@Nonnull
	public Numeric divide(@Nonnull Numeric that) throws NotDivisibleException {
		if (that instanceof Vector) {
			throw new ArithmeticException();
		} else if (that instanceof Matrix) {
			return multiply(that.inverse());
		} else {
			Vector v = newInstance();
			for (int i = 0; i < n; i++) {
				v.element[i] = element[i].divide(that);
			}
			return v;
		}
	}

	@Nonnull
	public Numeric negate() {
		Vector v = newInstance();
		for (int i = 0; i < n; i++) v.element[i] = element[i].negate();
		return v;
	}

	public int signum() {
		for (int i = 0; i < n; i++) {
			int c = element[i].signum();
			if (c < 0) {
				return -1;
			} else if (c > 0) {
				return 1;
			}
		}
		return 0;
	}

	@Nonnull
	public Numeric valueOf(@Nonnull Numeric numeric) {
		if (numeric instanceof Vector || numeric instanceof Matrix) {
			throw new ArithmeticException();
		} else {
			Vector v = (Vector) unity(n).multiply(numeric);
			return newInstance(v.element);
		}
	}

	public Numeric magnitude2() {
		return scalarProduct(this);
	}

	public Numeric scalarProduct(Vector vector) {
		Numeric a = Real.ZERO;
		for (int i = 0; i < n; i++) {
			a = a.add(element[i].multiply(vector.element[i]));
		}
		return a;
	}

	@Nonnull
	public Numeric ln() {
		throw new ArithmeticException();
	}

	@Nonnull
	@Override
	public Numeric lg() {
		throw new ArithmeticException();
	}

	@Nonnull
	public Numeric exp() {
		throw new ArithmeticException();
	}

	public Numeric conjugate() {
		Vector v = newInstance();
		for (int i = 0; i < n; i++) v.element[i] = element[i].conjugate();
		return v;
	}

	public int compareTo(Vector vector) {
		return ArrayComparator.comparator.compare(element, vector.element);
	}

	public int compareTo(Numeric numeric) {
		if (numeric instanceof Vector) {
			return compareTo((Vector) numeric);
		} else {
			return compareTo(valueOf(numeric));
		}
	}

	public static Vector unity(int dimension) {
		Vector v = new Vector(new Numeric[dimension]);
		for (int i = 0; i < v.n; i++) {
			if (i == 0) v.element[i] = Real.ONE;
			else v.element[i] = Real.ZERO;
		}
		return v;
	}

	public String toString() {
		final StringBuilder result = new StringBuilder();

		result.append("[");

		for (int i = 0; i < n; i++) {
			result.append(element[i]).append(i < n - 1 ? ", " : "");
		}

		result.append("]");

		return result.toString();
	}

	@Nonnull
	protected Vector newInstance() {
		return newInstance(new Numeric[n]);
	}

	@Nonnull
	protected Vector newInstance(@Nonnull Numeric element[]) {
		return new Vector(element);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy