package ch.akuhn.hapax.linalg;
import static ch.akuhn.foreach.For.range;
public class DenseVector extends Vector {
private double unit = 0;
private double[] values;
public DenseVector(double[] values) {
this.values = values;
}
public DenseVector(int size) {
values = new double[size];
}
public double cosine(DenseVector other) {
assert other.size() == this.size();
double sum = 0;
for (int n: range(values.length))
sum += values[n] * other.values[n];
return sum / (this.length() * other.length());
}
@Override
public double get(int index) {
return values[index];
}
@Override
public double put(int index, double value) {
return values[index] = value;
}
@Override
public int size() {
return values.length;
}
public Vector times(double factor) {
double[] times = new double[values.length];
for (int n: range(values.length))
times[n] = values[n] * factor;
return new DenseVector(times);
}
@Override
public double length() {
if (unit != 0) return unit; // FIXME should purge cache on edit
double qsum = 0;
for (double value: values)
qsum += value * value;
if (qsum == 0) qsum = 1;
return unit = Math.sqrt(qsum);
}
}