00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 package de.picana.clusterer;
00014
00015 import java.text.*;
00016 import java.util.*;
00017
00018 import weka.core.*;
00019
00020
00030 public class MLVector implements Comparable {
00031
00032 private static final DecimalFormat df;
00033 private static Random rand = new Random();
00034
00035 static {
00036 df = (DecimalFormat)DecimalFormat.getInstance(Locale.ENGLISH);
00037 df.applyPattern("####0.000000");
00038 }
00039
00040 public double[] value;
00041 public int dim;
00042 public int freq;
00043 public boolean pruned;
00044 public boolean visited;
00045
00047 public MLVector(int dim) {
00048 this.value = new double[dim];
00049 this.freq = 0;
00050 this.pruned = false;
00051 this.visited = false;
00052 this.dim = dim;
00053 }
00054
00055 public MLVector(Instance inst) {
00056 this.value = new double[inst.numAttributes()];
00057 this.freq = 1;
00058 this.pruned = false;
00059 this.visited = false;
00060 this.dim = inst.numAttributes();
00061 for (int i=0; i < dim; i++) {
00062 this.value[i] = inst.value(i);
00063 }
00064 }
00065
00066 public boolean equals(Object o) {
00067 if (!(o instanceof MLVector))
00068 return false;
00069
00070 MLVector vec = (MLVector)o;
00071
00072 if (vec.dim != this.dim)
00073 return false;
00074
00075 boolean eq = true;
00076
00077 int i = 0;
00078 while ((i < vec.dim) && (eq != false)) {
00079 if (vec.value[i] != this.value[i])
00080 eq = false;
00081 i++;
00082 }
00083
00084 return eq;
00085 }
00086
00087 public int hashCode() {
00088 double sum = 0.0;
00089 int i;
00090 for (i=0; i < dim; i++)
00091 sum += value[i];
00092 return (int)(sum * 100000 / dim);
00093 }
00094
00095 public int compareTo(Object o) {
00096 MLVector vec = (MLVector)o;
00097
00098 if (vec.dim != this.dim)
00099 return -1;
00100
00101 int i = 0;
00102 while (i < vec.dim) {
00103 if (this.value[i] < vec.value[i])
00104 return -1;
00105 else if (this.value[i] > vec.value[i])
00106 return 1;
00107 i++;
00108 }
00109
00110 return 0;
00111 }
00112
00113 public void mult(double scalar) {
00114 for (int i=0; i < value.length; i++) {
00115 value[i] *= scalar;
00116 }
00117 }
00118
00119 public void add(MLVector vec) {
00120 for (int i=0; i < value.length; i++) {
00121 value[i] += vec.value[i];
00122 }
00123 }
00124
00125 public void sub(MLVector vec) {
00126 for (int i=0; i < value.length; i++) {
00127 value[i] -= vec.value[i];
00128 }
00129 }
00130
00131 public static MLVector sub(MLVector vec1, MLVector vec2) {
00132 MLVector vec = new MLVector(vec1.dim);
00133 for (int i=0; i < vec.dim; i++) {
00134 vec.value[i] = vec1.value[i] - vec2.value[i];
00135 }
00136 return vec;
00137 }
00138
00139 public static MLVector getRandom(MLVector src, double radius) {
00140 MLVector vec = new MLVector(src.dim);
00141 for (int i=0; i < src.dim; i++) {
00142 vec.value[i] = src.value[i] + (radius - rand.nextDouble() * (radius * 2));
00143 if (vec.value[i] < 0) vec.value[i] = 0.0;
00144 if (vec.value[i] > 1.0) vec.value[i] = 1.0;
00145 }
00146 return vec;
00147 }
00148
00149 public String toString() {
00150 int i;
00151 String str = "(";
00152 for (i=0; i < dim; i++) {
00153 str += value[i];
00154 if (i != dim-1)
00155 str += ", ";
00156 }
00157 str += ") -> ";
00158 str += this.freq;
00159 return str;
00160 }
00161 }