我使用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

当我试图得到的IT产生下面的错误。

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]

空间sSingularValueDecomposition构造被初始化(AMD没有别的地方)是这样的:

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

所以贾马实施将用于2×3的输入工作(顶撞他们在类的javadoc说的话)。但我敢打赌,它会为2x4的输入无法工作。

其他提示

你能不能告诉我们,正在访问矩阵的代码?你会得到明确的例外表明您正在尝试为基础数组的法律界限的指数之外。

这是一个3x11阵列。你得到的索引越界异常为I = 4的事实表明,我认为你的行数不正确的地方规定。

如Apache下议院数学可以帮助另一个库,但我不相信图书馆是这里的问题。这是你缺乏SVD的理解这才是真正的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top