Package ch.akuhn.matrix.eigenvalues

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

package ch.akuhn.matrix.eigenvalues;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

import ch.akuhn.matrix.Matrix;

public class FewEigenvaluesTest {

  private FewEigenvalues eigen;
  private Matrix A;

  private Matrix randomSymetricMatrix(int n) {
    Matrix S = Matrix.dense(n, n);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < i; j++) {
        double value = Math.random() * 23;
        S.put(i, j, value);
        S.put(j, i, value);
      }
    }
    return S;
  }

  @Test
  public void shouldDecomposeRandomArray() {
    A = randomSymetricMatrix(100);
    eigen = FewEigenvalues.of(A).largest(40);
    eigen.run();
    assert eigen.value.length == 40;
    assert eigen.vector.length == 40;
  }

  @Test
  // @Given("shouldDecomposeRandomArray")
  public void shouldReturnSortedEigenvalues() {
    shouldDecomposeRandomArray();
    for (int i = 1; i < 40; i++) {
      assert eigen.value[i - 1] <= eigen.value[i];
      assert eigen.value[i] > 0; // should be likely :)
    }
  }

  @Test
  // @Given("shouldDecomposeRandomArray")
  public void shouldReturnEigenvectors() {
    shouldDecomposeRandomArray();
    for (int i = 1; i < 40; i++) {
      assert eigen.vector[i] != null;
      assert eigen.vector[i].size() == 100;
    }
  }

  @Test
  // @Given("shouldDecomposeRandomArray")
  public void matrixEigenvectorMultiplicationShouldEqualEigenvectorTimesEigenvalue() {
    shouldDecomposeRandomArray();
    for (int i = 0; i < 40; i++) {
      assert eigen.vector[i].times(eigen.value[i]).equals(A.mult(eigen.vector[i]), 1e-6);
    }
  }

  @Test
  public void shouldDecomposeSmallMatrix() {
    A = Matrix.from(3, 3, 0, 1, -1, 1, 1, 0, -1, 0, 1);
    eigen = FewEigenvalues.of(A).largest(2);
    eigen.run();

    assertEquals(1, eigen.value[0], 1e-6);
    assertEquals(2, eigen.value[1], 1e-6);

    assert A.mult(eigen.vector[0]).equals(eigen.vector[0].times(eigen.value[0]), 1e-6);
    assert A.mult(eigen.vector[1]).equals(eigen.vector[1].times(eigen.value[1]), 1e-6);
  }

}
TOP

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

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.