package edu.umd.cloud9.example.clustering; import java.util.Arrays; import java.util.Locale; /** * Parameter vector. */ public final class PVector { private int dim; public double[] array; /** * Class constructor. * * @param dim dimension of the vector */ public PVector(int dim) { this.dim = dim; this.array = new double[dim]; } public PVector plus(PVector v2) { PVector result = new PVector(this.dim); PVector q = v2; for (int i = 0; i < q.dim; i++) result.array[i] = this.array[i] + q.array[i]; return result; } public PVector minus(PVector v2) { PVector result = new PVector(this.dim); PVector q = v2; for (int i = 0; i < q.dim; i++) result.array[i] = this.array[i] - q.array[i]; return result; } public PVector times(double lambda) { PVector result = new PVector(this.dim); for (int i = 0; i < dim; i++) result.array[i] = this.array[i] * lambda; return result; } public double dot(PVector v2) { double result = 0.0d; PVector q = v2; for (int i = 0; i < q.dim; i++) result += this.array[i] * q.array[i]; return result; } /** * Generates of a random vector \f$ v = (x_1, x_2, \cdots )\f$ where each component is drawn * uniformly in \f$ \mathcal{U}(0,1)\f$. * * @param dim dimension of the vector * @return random vector */ public static PVector sampleRandomVector(int dim) { PVector result = new PVector(dim); for (int i = 0; i < dim; i++) result.array[i] = Math.random(); return result; } /** * Generates of a random vector \f$ v = (x_1, x_2, \cdots )\f$ where each component is drawn * uniformly in \f$ \mathcal{U}(0,1)\f$. The vector is normalized such as \f$ \sum_i x_i = 1 \f$. * * @param dim dimension of the vector * @return random vector */ public static PVector sampleRandomDistribution(int dim) { PVector result = sampleRandomVector(dim); int i; double cumul = 0.0d; for (i = 0; i < dim; i++) cumul += result.array[i]; for (i = 0; i < dim; i++) result.array[i] /= cumul; return result; } /** * Verifies if two vectors are similar. * * @param v1 vector \f$ v_1 \f$ * @param v2 vector \f$ v_2 \f$ * @return true if \f$ v_1 = v_2 \f$, false otherwise */ public static boolean equals(PVector v1, PVector v2) { return Arrays.equals(v1.array, v2.array); } /** * Computes the Euclidean norm of the current vector \f$ v \f$. * * @return \f$ \|v\|_2 \f$ */ public double norm2() { double norm = 0; for (int i = 0; i < array.length; i++) norm += this.array[i] * this.array[i]; return Math.sqrt(norm); } public String toString() { String output = "( "; for (int i = 0; i < dim; i++) output += String.format(Locale.ENGLISH, "%13.6f ", array[i]); return output + ")"; } /** * Creates and returns a copy of the instance. * * @return a clone of the instance. */ public PVector clone() { PVector param = new PVector(this.dim); param.array = this.array.clone(); return param; } /** * Returns vector's dimension. * * @return vector's dimension. */ public int getDimension() { return this.dim; } }