如何在 Android Studio 中 overwrite/update Jama Matrix 而不会出现任何错误?
How to overwrite/update a Jama Matrix in Android Studio without any error?
Jama 矩阵在我的代码(矩阵计算class)中定义如下:
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
class 中的下一个相同大小的矩阵更新。
矩阵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);
在这里,矩阵计算class被MainActivity class每秒调用一次,矩阵B
相应更新。但是,代码仅在第一次迭代时运行良好,随后会抛出如下错误:
java.lang.IllegalArgumentException: Matrix inner dimensions must agree.
经过一番挖掘,我发现这是由于矩阵覆盖(矩阵B
和C
)引起的。我的代码中的矩阵不能是 static
或 final
。当矩阵不是静态时,有什么方法可以使用 Jama 矩阵吗?在 android 工作室中有没有 Jama 的替代品用于 Matrix 操作?
查看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;
}
所以 appearently C.times(B)
失败了,这意味着 C
和 B
维度不一致。我们还可以从下面的行中看到,C = new Matrix(2,2)
确实有 2x2 大小,这意味着 B
一定有错误的大小。
我不明白你说的"matrix overwriting"是什么意思? C = A.plus(C.times(B))
确实在内部分配了 Matrix
的新实例。这与 static
或 final
.
无关
请提供一个complete, minimal example。少了很多地方,比如B初始化的地方
Jama 矩阵在我的代码(矩阵计算class)中定义如下:
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
class 中的下一个相同大小的矩阵更新。
矩阵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);
在这里,矩阵计算class被MainActivity class每秒调用一次,矩阵B
相应更新。但是,代码仅在第一次迭代时运行良好,随后会抛出如下错误:
java.lang.IllegalArgumentException: Matrix inner dimensions must agree.
经过一番挖掘,我发现这是由于矩阵覆盖(矩阵B
和C
)引起的。我的代码中的矩阵不能是 static
或 final
。当矩阵不是静态时,有什么方法可以使用 Jama 矩阵吗?在 android 工作室中有没有 Jama 的替代品用于 Matrix 操作?
查看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;
}
所以 appearently C.times(B)
失败了,这意味着 C
和 B
维度不一致。我们还可以从下面的行中看到,C = new Matrix(2,2)
确实有 2x2 大小,这意味着 B
一定有错误的大小。
我不明白你说的"matrix overwriting"是什么意思? C = A.plus(C.times(B))
确实在内部分配了 Matrix
的新实例。这与 static
或 final
.
请提供一个complete, minimal example。少了很多地方,比如B初始化的地方