Package ch.akuhn.matrix.eigenvalues

Source Code of ch.akuhn.matrix.eigenvalues.SingularValues

package ch.akuhn.matrix.eigenvalues;

import java.util.Random;

import ch.akuhn.matrix.Matrix;
import ch.akuhn.matrix.SparseMatrix;
import ch.akuhn.matrix.Vector;
import ch.akuhn.util.Out;
import ch.akuhn.util.Stopwatch;

public class SingularValues {

  public double[] value;
  public Vector[] vectorLeft;
  public Vector[] vectorRight;

  Matrix A;
  private int nev;

  public SingularValues(Matrix A, int nev) {
    this.A = A;
    this.nev = nev;
  }

  public SingularValues decompose() {
    Eigenvalues eigen = new FewEigenvalues(A.rowCount()) {
      @Override
      protected Vector callback(Vector v) {
        return A.mult(A.transposeMultiply(v));
      }
    }.greatest(nev).run();
    value = new double[nev];
    vectorLeft = eigen.vector;
    vectorRight = new Vector[nev];
    for (int i = 0; i < nev; i++) {
      value[i] = Math.sqrt(eigen.value[i]);
      vectorRight[i] = A.transposeMultiply(vectorLeft[i]);
      vectorRight[i].times(1.0 / vectorRight[i].norm());
    }
    return this;
  }

  public static void main(String... args) {
    Stopwatch.enter();
    Stopwatch.p();
    SparseMatrix A = Matrix.sparse(4000, 10000);
    Random rand = new Random(1);
    for (int i = 0; i < A.rowCount(); i++) {
      for (int j = 0; j < A.columnCount(); j++) {
        if (rand.nextDouble() > 0.2) continue;
        A.put(i, j, rand.nextDouble() * 23);
      }
    }
    SingularValues singular = new SingularValues(A, 10).decompose();
    Stopwatch.p();
    Out.puts(singular.value);
  }

}
TOP

Related Classes of ch.akuhn.matrix.eigenvalues.SingularValues

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.