package ch.akuhn.matrix;
import static ch.akuhn.foreach.For.range;
public class DenseVector extends Vector {
private double unit = 0;
/*default*/ double[] values;
protected DenseVector(double[] values) {
this.values = values;
}
protected 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.norm() * other.norm());
}
@Override
public double get(int index) {
return values[index];
}
@Override
public double norm() {
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);
}
@Override
public double put(int index, double value) {
return values[index] = value;
}
@Override
public int size() {
return values.length;
}
@Override
public Vector times(double scalar) {
double[] times = new double[values.length];
for (int n: range(values.length))
times[n] = values[n] * scalar;
return new DenseVector(times);
}
@Override
public boolean equals(Vector v, double epsilon) {
if (size() != v.size()) return false;
assert v instanceof DenseVector;
DenseVector d = (DenseVector) v;
for (int i = 0; i < values.length; i++) {
if ((values[i] - d.values[i]) > epsilon) return false;
}
return true;
}
@Override
public void apply(Function f) {
for (int n = 0; n < values.length; n++) values[n] = f.apply(values[n]);
}
@Override
public double[] unwrap() {
return values;
}
}