Вопрос

Я использую библиотеку 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();       
    }

}
Это было полезно?

Решение

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

РЕДАКТИРОВАТЬ: Вот соответствующий код из 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 это не сработает.

Другие советы

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

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

Другая библиотека, например Apache Commons Math, может помочь, но я не думаю, что проблема здесь в библиотеке.Настоящая проблема в вашем непонимании СВД.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top