1

マトリックスに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();       
    }

}
4

3 に答える 3

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 での記述と矛盾します)。しかし、2x4 入力では機能しないに違いありません。

于 2010-01-21T21:33:31.537 に答える
0

マトリックスにアクセスしているコードを教えていただけますか? 取得した例外は、基になる配列の有効な範囲外でインデックスを作成しようとしていることを明確に示しています。

于 2010-01-21T21:22:30.737 に答える
0

これは 3x11 配列です。i = 4 の範囲外のインデックス例外を取得しているという事実は、行数がどこかで正しく指定されていないことを示唆しています。

Apache Commons Math のような別のライブラリが役立つかもしれませんが、ここでライブラリが問題になるとは思いません。本当の問題は、あなたが SVD を理解していないことです。

于 2010-01-21T21:33:15.533 に答える