package kmeans;
import java.io.Serializable;
/**
* A class that represents the sum of 'count' number of vectors.
*/
class SumVector implements Serializable {
private static final long serialVersionUID = -6202104451669002837L;
private float[] summedVector;
private int count;
SumVector(int dim, float[] points, int pt) {
summedVector = new float[dim];
System.arraycopy(points, pt*dim, summedVector, 0, dim);
count = 0;
}
SumVector(int dim) {
summedVector = new float[dim];
count = 0;
}
public void makeZero() {
java.util.Arrays.fill(summedVector, 0.0f);
count = 0;
}
public void addIn(float[] a) {
for (int i=0; i<a.length; i++) {
summedVector[i] += a[i];
}
count++;
}
public void addIn(int nd, float[] points, int point) {
int offset = nd * point;
for (int i=0; i<nd; i++) {
summedVector[i] += points[offset + i];
}
count++;
}
public void addIn(SumVector other) {
for (int i=0; i<summedVector.length; i++) {
summedVector[i] += other.summedVector[i];
}
count += other.count;
}
public void divide(int f) {
for (int i=0; i<summedVector.length; i++) {
summedVector[i] /= f;
}
}
public float distance(float[] a) {
float dist =0.0F;
for (int i=0; i<summedVector.length; i++) {
float tmp = summedVector[i] - a[i];
dist += tmp*tmp;
}
return dist;
}
public float distance(int nd, float[] points, int point) {
float dist =0.0F;
int offset = nd * point;
for (int i=0; i<summedVector.length; i++) {
float tmp = summedVector[i] - points[offset+i];
dist += tmp*tmp;
}
return dist;
}
public float distance(SumVector vec) {
return distance(vec.summedVector);
}
public void print() {
System.out.println();
for (int i=0; i<summedVector.length; i++) {
if (i>0) System.out.print(" ");
System.out.print(summedVector[i]);
}
}
public void normalize() {
divide(count);
}
public int count() {
return count;
}
public float getSumElement(int i) { return summedVector[i]; }
}