Как я могу исправить эту ошибку ArrayIndexOutOfBounds в Jama? - PullRequest
1 голос
/ 22 января 2010

Я использую библиотеку jama для матрицы. Я использовал следующую матрицу, но когда я попытался получить S, это дало мне ошибку.

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

Когда я пытался получить S, выдается следующая ошибка.

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

Вот код

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

}

Ответы [ 3 ]

3 голосов
/ 22 января 2010

Для разложения единственного значения по Джаме, количество строк не должно быть меньше количества столбцов Возможно, вам следует попробовать SVD для транспонирования предоставленной вами матрицы.

РЕДАКТИРОВАТЬ: Вот соответствующий код от 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 построен как массив n x n, поэтому единственным возможным источником ArrayIndexOutOfBoundsException является ссылка на this.s[i].

Пробел для s инициализируется в конструкторе SingularValueDecomposition (и где-либо еще):

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

Таким образом, реализация Jama будет работать для ввода 2x3 (что противоречит тому, что они говорят в классе javadoc). Но держу пари, что для входа 2x4 это не сработает.

0 голосов
/ 22 января 2010

Это массив 3х11. Тот факт, что вы получаете исключение индекса за пределами границ для i = 4, подсказывает мне, что ваше число строк указано где-то неправильно.

Может помочь еще одна библиотека, например Apache Commons Math, но я не думаю, что проблема здесь в библиотеке. Это ваше непонимание SVD, это реальная проблема.

0 голосов
/ 22 января 2010

Не могли бы вы показать нам код, который обращается к матрице? Исключение, которое вы получаете, ясно указывает на то, что вы пытаетесь индексировать вне допустимых границ базового массива.

...