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]

空间 forsSingularValueDecomposition构造函数中初始化(没有其他地方),如下所示:

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 回答