Pergunta

Estou usando o Jama Libarary para Matrix. Eu usei a Matrix seguinte, mas quando tentei obter S, isso me deu erro.

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 tentei obter, ele produz um erro seguinte.

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

Aqui está o código

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

}
Foi útil?

Solução

Por Jama decomposição de valor singular, O número de linhas não deve ser menor que o número de colunas. Talvez você deva experimentar o SVD na transposição da matriz que você forneceu.

EDITAR: Aqui está o código relevante 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 é construído para ser um n x n matriz, então a única fonte possível de um ArrayIndexOutOfBoundsException é da referência a this.s[i].

Espaço para s é inicializado no SingularValueDecomposition Construtor (AMD NO onde mais) como este:

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

Portanto, a implementação do JAMA funcionará para uma entrada 2x3 (contradizendo o que eles dizem na classe Javadoc). Mas aposto que não funcionará para uma entrada 2x4.

Outras dicas

Você poderia nos mostrar o código que está acessando a matriz? A exceção que você recebe claramente indica que está tentando indexar fora dos limites legais da matriz subjacente.

É uma matriz 3x11. O fato de você estar obtendo um índice fora da exceção dos limites para i = 4 sugere que sua contagem de linhas seja especificada incorretamente em algum lugar.

Outra biblioteca como a Apache Commons Math pode ajudar, mas não acredito que a biblioteca seja o problema aqui. É sua falta de entendimento do SVD que é o problema real.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top