Java 方法更改传递给他的对象的值

Java 方法更改传递给他的对象的值,java,Java,我的代码有问题, 算法是正确的,但我不明白为什么matrixInverse方法会改变矩阵的值。。MatrixInverse只返回身份 我怎样才能解决这个问题 public class Main { public static void main(String[] args){ double[][] matrix = new double[][]{{ 56, 0, 0, 34, 0, 0},

我的代码有问题, 算法是正确的,但我不明白为什么matrixInverse方法会改变矩阵的值。。MatrixInverse只返回身份

我怎样才能解决这个问题

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,以强制自己不要更改它。深度复制的问题是,矩阵可能非常大,然后求解时间会增加您没有正确设置反转矩阵。维基百科的文章会帮你解决这个问题。