Java 方法更改传递给他的对象的值
我的代码有问题, 算法是正确的,但我不明白为什么matrixInverse方法会改变矩阵的值。。MatrixInverse只返回身份 我怎样才能解决这个问题Java 方法更改传递给他的对象的值,java,Java,我的代码有问题, 算法是正确的,但我不明白为什么matrixInverse方法会改变矩阵的值。。MatrixInverse只返回身份 我怎样才能解决这个问题 public class Main { public static void main(String[] args){ double[][] matrix = new double[][]{{ 56, 0, 0, 34, 0, 0},
public class Main {
public static void main(String[] args){
double[][] matrix = new double[][]{{ 56, 0, 0, 34, 0, 0},
{ 0, 1, 0, 0, 0, 0},
{ 0, 0, 1, 0, 0, 0},
{ 1, 0, 0, 1, 0, 0},
{ 0, 0, 0, 0, 1, 0},
{ 0, 0, 0, 0, 0, 1},
};
double[][] inverse = MathUtilities.matrixInverse(matrix);
}
}
方法matrixInverse:
public static double[][] matrixInverse(double[][] mat) throws ArithmeticException {
if (mat.length != mat[0].length) {
System.err.println("Matrix is not square");
ArithmeticException e = new ArithmeticException();
throw e;
}
double[][] matrix = mat;
double[][] identity = new double [matrix.length][matrix.length];
//----------------------------------------------------------------------
for(int i = 0;i < matrix.length;++i)
{
for(int j = 0;j < matrix.length; ++j)
{
if(i == j)
identity[i][j] = 1;
else
identity[i][j] = 0;
}
}
//----------------------------------------------------------------------
for(int i = 0; i < matrix.length; ++i)
{
for(int j = i + 1 ; j < matrix.length; ++j)
{
double constant = matrix[j][i]/matrix[i][i];
for(int k = 0; k < matrix.length; ++k)
{
matrix[j][k] = matrix[j][k] - (constant * matrix[i][k]);
identity[j][k] = identity[j][k] - (constant * identity[i][k]);
}
}
}
//----------------------------------------------------------------------
for(int i = matrix.length - 1;i >= 0; --i)
{
for(int j = i - 1; j >= 0; --j)
{
double constant1 = matrix[j][i]/matrix[i][i];
for(int k = matrix.length - 1 ; k >= 0; k--)
{
matrix[j][k] = matrix[j][k] - constant1 * matrix[i][k];
identity[j][k] = identity[j][k] - constant1 * identity[i][k];
}
}
}
//----------------------------------------------------------------------
for(int i = 0 ; i < matrix.length; ++i)
{
for(int j = 0;j < matrix.length; ++j)
{
identity[i][j]=identity[i][j]/matrix[i][i];
}
}
System.out.println("The inverse matrix is");
return identity;
}
双[]矩阵=矩阵
在这一行代码中,您指定的是引用,而不是复制对象。因此,如果更改矩阵或mat,实际上是在更改同一对象。这也值得一看。深度副本可以防止修改原始矩阵。好的,但是如果我在方法内部更改对象,那么在方法外部也可以看到更改?java没有传递引用的值?是的,更改在外部仍然可见。令人困惑的是,Java是按值传递的,但对象引用本身就是值,因此它可能看起来是按引用传递的。谢谢,我该如何解决我的问题?我想我可以创建两个循环,在这个循环中,我将矩阵的每个值分配给另一个double,并在matrixInverse中使用它,但如果矩阵很大,则需要时间,我的建议是进行一些重构。尝试将所有这些不同的for循环浓缩在一起。这似乎是更新矩阵的唯一原因。另一个好主意是使输入参数final double[][]mat,以强制自己不要更改它。深度复制的问题是,矩阵可能非常大,然后求解时间会增加您没有正确设置反转矩阵。维基百科的文章会帮你解决这个问题。