Domanda

Sto usando jama libarary per Matrix. Ho usato matrice seguente, ma quando ho cercato di ottenere S, mi ha dato errore.

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

Quando ho cercato di ottenere S si produce seguente errore.

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

Ecco il codice

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();       
    }

}
È stato utile?

Soluzione

decomposizione in valori singolari di Jama, il numero di righe non deve essere inferiore al numero di colonne . Forse si dovrebbe cercare SVD sul trasposta della matrice che hai fornito.

Modifica Ecco il relativo codice da 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 è costruito per essere una matrice n x n, quindi l'unica possibile fonte di un ArrayIndexOutOfBoundsException è dal riferimento this.s[i].

Spazio per s viene inizializzato nel costruttore SingularValueDecomposition (AMD in nessun altro) in questo modo:

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

Quindi, l'attuazione Jama lavorerà per un ingresso 2x3 (contraddicendo quello che dicono nel javadoc classe). Ma scommetto che non funzionerà per un ingresso 2x4.

Altri suggerimenti

Ci può mostrare il codice che accede la matrice? L'eccezione si ottiene indica chiaramente che si sta tentando di indicizzare al di fuori dei limiti legali di matrice sottostante.

E 'una matrice 3x11. Il fatto che si sta ottenendo un indice di eccezione limiti per i = 4 mi fa pensare che il valore del tuo riga viene specificato in modo non corretto da qualche parte.

Un'altra libreria come Apache Commons matematica potrebbe aiutare, ma non credo la biblioteca è il problema qui. E 'il tuo mancanza di comprensione della SVD questo è il vero problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top