【问题标题】:How do I fix this ArrayIndexOutOfBounds error in Jama?如何在 Jama 中修复此 ArrayIndexOutOfBounds 错误?
【发布时间】:2010-01-21 21:18:23
【问题描述】:

我正在使用 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();       
    }

}

【问题讨论】:

    标签: java math indexoutofboundsexception jama


    【解决方案1】:

    对于 Jama 的奇异值分解,the number of rows must not be less than the number of columns。也许您应该在您提供的矩阵的转置上尝试 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 输入。

    【讨论】:

    • 我不认为这是问题所在。因为如果我使用 3 列和 2 行数组,它可以正常工作。您甚至可以在我的代码中使用以下数组,它可以正常工作 double[][] vals = { {1,1,0}, {1,0,1} };
    • 有什么办法,我可以让它为 m
    • 转置矩阵意味着切换行和列,这将在您的情况下创建一个 11x3 矩阵。我认为将您的倒数第四行更改为SingularValueDecomposition svd = A.transpose().svd(); 会起作用。 Jama 中的一个缺陷是 SVD 操作还没有做这样的事情来处理宽(而不是高)矩阵。
    • 非常感谢您快速且内容丰富的回复。您能告诉我如何将 MATRIX 转换为二维双数组吗?
    • @agazerboy - 请参阅 javadoc 中的 Matrix getArray()getArrayCopy() 方法 - math.nist.gov/javanumerics/jama/doc/Jama/Matrix.html
    【解决方案2】:

    您能告诉我们访问矩阵的代码吗?您得到的异常清楚地表明您正在尝试在基础数组的合法范围之外进行索引。

    【讨论】:

      【解决方案3】:

      这是一个 3x11 数组。您获得 i = 4 的索引越界异常这一事实向我表明,您的行数在某处指定不正确。

      像 Apache Commons Math 这样的另一个库可能会有所帮助,但我不认为这个库是这里的问题。真正的问题是您对 SVD 缺乏了解。

      【讨论】:

      • 你现在可以看到代码了,我没有在任何地方错误地使用i。
      • JAMA 似乎不同意你的观点。
      • 查看我的编辑 - Apache Commons Math:commons.apache.org/math。有人告诉我,JAMA 已经死了; Apache Commons Math 已将其拾取并对其进行了扩展。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2021-10-01
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多