/** * @param dir * @return construct and perform a {@link GramSchmidtProcess} */ public static Vector[] perform(double[] dir) { return new GramSchmidtProcess(0).apply(dir); }
@Override public Vector[] apply(double[] in) { Vector[] vmat = new Vector[in.length]; vmat[0] = new DenseVector(in); double norm = vmat[0].norm(Norm.Two); vmat[0].scale(1/norm); for (int j = 1; j < in.length; j++) { Vector randvec = randvec(vmat[0].size(),norm); vmat[j] = new DenseVector(vmat[0]).add(randvec); for (int i = 0; i < j; i++) { vmat[j].add(-1, project(vmat[j],vmat[i])); } vmat[j].scale(1/vmat[j].norm(Norm.Two)); } return vmat; }
/** * @param supports * @param weights * @return the vectors defining the plane */ public static Vector[] getPlaneDirections(List<double[]> supports, List<Double> weights) { double[] dir = getDirection(supports, weights); int ind = 0; // for (int i = 0; i < weights.size(); i++) { // double[] ds = supports.get(i); // System.out.println("Support " + ind++ + ": " + weights.get(i) + " * " +Arrays.toString(ds) ); // } // System.out.println("Number of supports: " + supports.size() + " direction: " + Arrays.toString(dir)); Vector[] all = GramSchmidtProcess.perform(dir); Vector[] ret = new Vector[all.length-1]; for (int i = 0; i < ret.length; i++) { ret[i] = all[i+1]; } return ret; }
/** * @param args */ public static void main(String[] args) { GramSchmidtProcess proc = new GramSchmidtProcess(); Vector[] allvec = proc.apply(new double[]{0,0,1}); for (Vector vector : allvec) { System.out.println(vector); } } /**
public Vector[] getPlane() { Vector[] allInclusive = new GramSchmidtProcess().apply(new DenseVector(direction).getData()); Vector[] ret = new Vector[allInclusive.length - 1]; for (int i = 0; i < ret.length; i++) { ret[i] = allInclusive[i+1]; } return ret; }