Question

J'utilise jama libarary pour la matrice. J'ai utilisé matrice suivante mais quand je l'ai essayé d'obtenir S, il m'a donné l'erreur.

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

Quand j'ai essayé d'obtenir S il produire erreur suivant.

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

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

}
Était-ce utile?

La solution

JAMA décomposition de valeurs singulières, le nombre de lignes ne doit pas être inférieur au nombre de colonnes . Peut-être que vous devriez essayer SVD sur la transposée de la matrice que vous avez fourni.

EDIT: Voici le code correspondant de 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 est construit pour être un tableau de n x n, de sorte que la seule source possible d'un ArrayIndexOutOfBoundsException est de la référence à this.s[i].

L'espace pour s est initialisé dans le constructeur de SingularValueDecomposition (amd pas ailleurs) comme ceci:

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

Ainsi, la mise en œuvre Jama fonctionnera pour une entrée de 2x3 (contredisant ce qu'ils disent dans la javadoc de classe). Mais je parie que cela ne fonctionnera pas pour une entrée 2x4.

Autres conseils

Pourriez-vous nous montrer le code qui accède à la matrice? L'exception vous indique clairement que vous essayez d'indexer en dehors des limites légales du tableau sous-jacent.

Il est un tableau de 3x11. Le fait que vous obtenez un index hors d'exception des limites pour i = 4 me porte à croire que votre nombre de lignes est spécifiée de manière incorrecte, quelque part.

Une autre bibliothèque comme Apache Commons Math pourrait aider, mais je ne crois pas que la bibliothèque est la question ici. Il est votre manque de compréhension de SVD qui est le vrai problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top