变量(矩阵)更改其值-Java
我的代码有问题。我有一个包含整数矩阵的对象,我使用这个矩阵作为原始模型来创建其他矩阵。但最后,我的原始矩阵有一个不同的值,但我不会以任何方式改变变量(矩阵)更改其值-Java,java,matrix,multidimensional-array,Java,Matrix,Multidimensional Array,我的代码有问题。我有一个包含整数矩阵的对象,我使用这个矩阵作为原始模型来创建其他矩阵。但最后,我的原始矩阵有一个不同的值,但我不会以任何方式改变 public Matrix generateAdjacencyMatrix(Matrix m) { int storedValue; int fitness; int[][] auxiliar_matrix = mc.matrixStructure.matrix; int[] original_ordering = mc.matrixS
public Matrix generateAdjacencyMatrix(Matrix m)
{
int storedValue;
int fitness;
int[][] auxiliar_matrix = mc.matrixStructure.matrix;
int[] original_ordering = mc.matrixStructure.matrixOrder;
for(int i=0;i<mc.matrixStructure.getMatrixSize();i++)
{
if(m.matrixOrder[i] != original_ordering[i]) //Only changes if the columns have changed
{
for(int j=0;j<mc.matrixStructure.getMatrixSize();j++)
{
storedValue = auxiliar_matrix[j][m.matrixOrder[i]];
auxiliar_matrix[j][m.matrixOrder[i]] = auxiliar_matrix[j][original_ordering[i]];
auxiliar_matrix[j][original_ordering[i]] = storedValue;
}
for(int j=0;j<mc.matrixStructure.getMatrixSize();j++)
{
storedValue = auxiliar_matrix[m.matrixOrder[i]][j];
auxiliar_matrix[m.matrixOrder[i]][j] = auxiliar_matrix[original_ordering[i]][j];
auxiliar_matrix[original_ordering[i]][j] = storedValue;
}
}
}
m.matrix = auxiliar_matrix;
m.setFitness(computeFitness(m.matrix));
return m;
}
这是创建其他矩阵的方法。对象mc包含我的原始矩阵mc.matrixStructure.matrix,在for循环之后,值就不同了
我正在构造函数方法上实例化此对象:
public GeneticAlgorithm() throws IOException
{
this.r = new Random();
this.matingPool = new ArrayList<>(populationSize);
this.population = new ArrayList<>(populationSize);
this.nextGeneration = new ArrayList<>(populationSize);
this.mc = new MatrixCreator("CS4006_input_file2.txt");
this.mc.check0or1();
this.mc.checkDiagonalLine();
this.mc.checkSymmetry();
this.auxiliarVector = mc.matrixStructure.matrixOrder;
this.auxiliarMatrix = new Matrix(mc.matrixStructure.getMatrixSize());
this.matrixSize = mc.matrixStructure.getMatrixSize();
}
就是这样。当你这样做的时候
int[][] auxiliar_matrix = mc.matrixStructure.matrix;
int[] original_ordering = mc.matrixStructure.matrixOrder;
。。。您正在对mc.matrixStructure.matrix和mc.matrixStructure.matrixOrder引用的相同对象进行辅助矩阵和原始排序引用。通过一组引用修改这些对象等同于通过另一组引用修改它们,因此与您的断言相反,您完全是在更改原始矩阵。为了避免这种情况,您需要复制阵列
此外,辅助矩阵有两个问题,因为Java2D数组是数组的数组,数组也是对象。您需要执行该二维阵列的深度复制,以避免修改原始对象
像这样的东西应该可以做到:
int[] original_ordering = Arrays.copyOf(mc.matrixStructure.matrixOrder);
int[][] auxiliar_matrix = Arrays.copyOf(mc.matrixStructure.matrix);
int i;
for (i = 0; i < auxiliar_matrix.length; i += 1) {
auxiliar_matrix[i] = Arrays.copyOf(auxiliar_matrix[i]);
}
将对象指定给引用变量时,即指定其引用。您不能将其复制到该引用 因此,在诸如
int[][] auxiliar_matrix = mc.matrixStructure.matrix;
您的辅助矩阵引用变量现在引用mc.matrixStructure.matrix引用的矩阵
它是同一个矩阵,位于堆上
现在您正在更改辅助矩阵所指对象内的数据。例如,这里:
auxiliar_matrix[j][original_ordering[i]] = storedValue;
这意味着它和mc.matrixStructure.matrix所引用的矩阵中的值都将发生更改
如果要处理原始矩阵的单独副本而不影响它,必须先将其复制到新对象,然后将此副本指定给辅助矩阵。在本例中,它是一个数组数组,因此您必须创建一个相同长度的新数组,并使用arrays.copyOf复制每个子数组。当心尝试在数组数组中使用ARARY.COMPOFE,拷贝浅,只复制对子数组的引用,这会给你相同的问题。 @ ICCTHEMANTHONE,这是java,不是C++。堆栈上没有分配对象,尽管对象引用可能存在于堆栈中。不过,出于其他原因,他确实需要做一些复制。非常感谢!我对Java中的引用仍然有一些问题,我一定会读一些这方面的文章…你的答案非常完美!我知道我做错了什么。谢谢你的回答!如果我有足够的声誉,我会投票……但你也帮了我很多忙!