Как я могу исправить эту ошибку ArrayIndexOutOfBounds в 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 ответа

Решение

Для разложения Jama по единственному значению количество строк не должно быть меньше количества столбцов. Возможно, вам стоит попробовать 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). Но держу пари, что для входа 2х4 это не сработает.

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

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

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

Другие вопросы по тегам