2010-01-21 3 views
1

Я использую jama libarary для матрицы. Я использовал следующую матрицу, но когда я попытался получить S, это дало мне ошибку.Как исправить ошибку ArrayIndexOutOfBounds в 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 

Когда я попытался получить 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's разложение особых значений, the number of rows must not be less than the number of columns. Может быть, вы должны попробовать SVD на транспонировании матрицы, которую вы предоставили.

EDIT: Вот соответствующий код из 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)]; 

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

+0

Я не думаю, что это проблема. Потому что, если я использую 3 столбца и 2 ряда строк, он работает нормально. Вы даже можете использовать следующий массив с моим кодом будет работать нормально двойной [] [] = {Vals \t \t \t \t {1,1,0}, \t \t \t \t {1,0,1} \t \t \t \t \t \t \t}; – user238384

+0

Есть ли способ, я могу заставить его работать для m user238384

+0

Транспонирование матрицы означает переключение строк и столбцов, что создало бы матрицу 11x3 в вашем случае.Я думаю, что изменить свою четвертую-последнюю строку на 'SingularValueDecomposition svd = A.transpose(). Svd();' будет работать. Это дефект в Jama, что операция SVD уже не делает что-то подобное для обработки широких (в отличие от высоких) матриц. – mob

0

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

+0

Я добавил код, просмотрите его – user238384

0

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

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

+0

Теперь вы можете видеть код, я не использовал i нигде. – user238384

+0

JAMA, похоже, не согласен с вами. – duffymo

+0

Можете ли вы рассказать мне о хорошем java-матрице libarary? – user238384