Frage

Ich bin mit JAMA libarary für Matrix. Früher habe ich folgende Matrix, aber wenn ich versuche, S zu bekommen, es gab mir Fehler.

1.0    1.0    0.0    1.0    0.0    0.0    0.0    0.0    0.0   11.0    1.0
1.0    0.0    0.0    0.0    0.0    0.0    1.0    0.0    0.0   12.0    2.0
1.0    1.0    0.0    0.0    0.0    0.0    0.0    0.0    1.0   13.0    3.0

Als ich versuchte, S, um es zu produzieren folgende Fehler.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Jama.SingularValueDecomposition.getS(SingularValueDecomposition.java:507)
    at SVD2.main(SVD2.java:19)

Hier ist der Code

public class SVD2 {
    public static void main(String[] args) {
        double[][] vals = {
              {1,1,0,1,0,0,0,0,0,11,1},
              {1,0,0,0,0,0,1,0,0,12,2},
              {1,1,0,0,0,0,0,0,1,13,3}
              };
        Matrix A = new Matrix(vals,3,11);
        System.out.println("The Matrix A is ");
        A.print(11, 2);
        System.out.println();

        System.out.println("The SVD of A is ");
        SingularValueDecomposition svd = A.svd();
        Matrix S = svd.getS();       
    }

}
War es hilfreich?

Lösung

Jamas Einzelwertzerlegung, die Anzahl der Zeilen muss kleiner sein nicht als die Anzahl der Spalten . Vielleicht sollten Sie SVD auf der Transponierung der Matrix versuchen Sie zur Verfügung gestellt.

EDIT: Hier ist der relevante Code aus SingularValueDecomposition.java:

   public Matrix getS () {
      Matrix X = new Matrix(n,n);
      double[][] S = X.getArray();
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
            S[i][j] = 0.0;
         }
         S[i][i] = this.s[i];
      }
      return X;
   }

S konstruiert ist ein n x n Array sein, so dass die einzige mögliche Quelle eines ArrayIndexOutOfBoundsException aus der Bezugnahme auf this.s[i] ist.

Raum für s wird im SingularValueDecomposition Konstruktor initialisiert (amd keine wo sonst) wie folgt aus:

s = new double [Math.min(m+1,n)];

So ist die Jama Implementierung für einen 2x3-Eingang arbeitet (im Widerspruch zu, was sie in der Klasse javadoc sagen). Aber ich wette, es wird nicht funktionieren für einen 2x4-Eingang.

Andere Tipps

Könnten Sie uns den Code, der die Matrix zugreift? Die Ausnahme, die Sie deutlich zu bekommen zeigt an, dass Sie indizieren außerhalb der gesetzlichen Grenzen des zugrunde liegenden Array versuchen.

Es ist ein 3x11-Array. Die Tatsache, dass Sie einen Index außerhalb der Grenzen Ausnahme sind immer für i 4 legt nahe, mir =, dass Ihre Zeilenanzahl falsch irgendwo angegeben ist.

Eine andere Bibliothek wie Apache Commons Math könnte helfen, aber ich glaube nicht, die Bibliothek ist das Problem hier. Es ist Ihr Mangel an SVD zu verstehen, dass das eigentliche Problem ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top