سؤال

أنا أستخدم jama libarary لمصفوفة. اعتدت على المصفوفة التالية ولكن عندما حاولت الحصول على 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

عندما حاولت الحصول على خطأ يلي.

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

}
هل كانت مفيدة؟

المحلول

ل جامع تحلل القيمة المفرد ، يجب ألا يكون عدد الصفوف أقل من عدد الأعمدة. ربما يجب أن تجرب 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 مُنشئ (AMD لا في أي مكان آخر) مثل هذا:

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

لذلك سيعمل تطبيق JAMA على مدخلات 2 × 3 (تناقض ما يقولون في الفئة Javadoc). لكنني أراهن أنه لن يعمل مع إدخال 2 × 4.

نصائح أخرى

هل يمكنك أن ترينا الرمز الذي يصل إلى المصفوفة؟ يشير الاستثناء الذي تحصل عليه بوضوح إلى أنك تحاول فهرسة خارج الحدود القانونية للمصفوفة الأساسية.

إنها مجموعة 3 × 11. حقيقة أنك تحصل على فهرس من الحدود استثناء لـ i = 4 تشير لي إلى أن عدد الصفوف الخاص بك محدد بشكل غير صحيح في مكان ما.

قد تساعد مكتبة أخرى مثل Apache Commons Math ، لكنني لا أعتقد أن المكتبة هي المشكلة هنا. إنه افتقارك إلى فهمك لـ SVD ، هذه هي المشكلة الحقيقية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top