【问题标题】:How to overwrite/update a Jama Matrix in Android Studio without any error?如何在 Android Studio 中覆盖/更新 Jama Matrix 而不会出现任何错误?
【发布时间】:2019-11-25 02:12:40
【问题描述】:

Jama 矩阵在我的代码(矩阵计算类)中定义如下:

private Matrix A;
private Matrix B;
private Matrix C;

矩阵A初始化如下:

A = new Matrix(2,2);
A.set(0,0,1.5);
A.set(0,1,0.0);
A.set(1,0,0.0);
A.set(1,1,1.5);

矩阵B 是一个 2*2 矩阵,初始化为单位矩阵,并由来自MainActivity 类的下一个相同大小的矩阵每秒更新一次。

矩阵C被初始化和计算如下:

 if(C!=null)
 C = A.plus(C.times(B));
 else {
 C = new Matrix(2,2);
 C.set(0,0,1);
 C.set(0,1,0.0);
 C.set(1,0,0.0);
 C.set(1,1,1);

这里,矩阵计算类MainActivity类每秒调用一次,矩阵B相应地更新。但是,代码仅在第一次迭代时运行良好,稍后会抛出错误,如下所示:

java.lang.IllegalArgumentException: Matrix inner dimensions must agree.

经过一番挖掘,我发现这是由于矩阵覆盖(矩阵BC)引起的。我的代码中的矩阵不能是staticfinal。当矩阵不是静态的时,有什么方法可以使用 Jama 矩阵? android studio 中的 Matrix 操作有没有 Jama 的替代品?

【问题讨论】:

  • 这与矩阵是静态还是最终无关。

标签: android android-studio matrix jama


【解决方案1】:

查看JAMA提供的源代码,在那个地方抛出了IllegalArgumentException:

   /** Linear algebraic matrix multiplication, A * B
   @param B    another matrix
   @return     Matrix product, A * B
   @exception  IllegalArgumentException Matrix inner dimensions must agree.
   */

   public Matrix times (Matrix B) {
      if (B.m != n) {
         throw new IllegalArgumentException("Matrix inner dimensions must agree.");
      }
      Matrix X = new Matrix(m,B.n);
      double[][] C = X.getArray();
      double[] Bcolj = new double[n];
      for (int j = 0; j < B.n; j++) {
         for (int k = 0; k < n; k++) {
            Bcolj[k] = B.A[k][j];
         }
         for (int i = 0; i < m; i++) {
            double[] Arowi = A[i];
            double s = 0;
            for (int k = 0; k < n; k++) {
               s += Arowi[k]*Bcolj[k];
            }
            C[i][j] = s;
         }
      }
      return X;
   }

看来C.times(B) 失败了,这意味着CB 尺寸不一致。从下面的行我们也可以看到,C = new Matrix(2,2) 确实有 2x2 大小,这意味着B 的大小肯定是错误的。

我不明白您所说的“矩阵覆盖”是什么意思? C = A.plus(C.times(B)) 确实在内部分配了一个 Matrix 的新实例。这与staticfinal 无关。

请提供complete, minimal example。缺少很多部分,比如初始化B的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多