2010-01-21 4 views
1

J'utilise jama libarary pour la matrice. J'ai utilisé la matrice suivante mais quand j'ai essayé d'obtenir S, cela m'a donné une erreur.Comment réparer cette erreur ArrayIndexOutOfBounds dans Jama?

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 

Lorsque j'ai essayé d'obtenir S, cela produit une erreur de suivi.

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

} 

Répondre

3

Pour la décomposition de la valeur singulière de Jama, the number of rows must not be less than the number of columns. Peut-être que vous devriez essayer SVD sur la transposition de la matrice que vous avez fournie.

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 n x n, donc la seule source possible d'un ArrayIndexOutOfBoundsException est de la référence à this.s[i].

Espace pour s est initialisé dans le constructeur SingularValueDecomposition (amd pas ailleurs) comme ceci:

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

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

+0

Je ne pense pas que ce soit le problème. Parce que si j'utilise 3 colonnes et 2 rangées de tableaux cela fonctionne bien. Vous pouvez même utiliser le tableau suivant avec mon code, il fonctionnera très bien doubles [] [] = {vals \t \t \t \t {1,1,0}, \t \t \t \t {1,0,1} \t \t \t \t \t \t \t}; – user238384

+0

Y at-il un moyen, je peux le faire fonctionner pour m user238384

+0

Transposer une matrice signifie changer de ligne et de colonne, ce qui créerait une matrice 11x3 dans votre cas.Je pense que le changement de votre avant-dernière ligne à 'SingularValueDecomposition svd = A.transpose(). Svd();' fonctionnerait. C'est un défaut de Jama que l'opération SVD ne fait pas déjà quelque chose comme ça pour gérer les matrices larges (par opposition aux grandes). – mob

0

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

+0

J'ai ajouté le code, S'il vous plaît le vérifier – user238384

0

Il s'agit d'une baie 3x11. Le fait que vous obteniez une exception d'index hors limites pour i = 4 me suggère que votre nombre de lignes est spécifié incorrectement quelque part.

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

+0

Vous pouvez voir le code maintenant, je ne l'ai pas utilisé incorrectement partout. – user238384

+0

JAMA semble être en désaccord avec vous. – duffymo

+0

Pouvez-vous me dire anyohter bonne bibliothèque java libarary? – user238384

Questions connexes