下面的代码是我的“消除方法”,它是关于高斯算法的。我正在努力理解为什么我的消除方法不起作用。其他 2 个(表示旋转的 pivotisiere 和表示求解方法的 loese)工作得非常好。我整天都坐在这里试图对其进行编码,但没有找到解决方案,如果有任何帮助,我会很高兴。
该方法应该如何工作:矩阵对角线下方的数字需要转换为“0”,并且与 0(包括向量)在同一行中的其余数字也需要相应地转换。
如果我使用 LCM(最小公倍数)来计算因子,我得到的结果仍然是正确的(和整数!!!)但仍然与测试用例相差 2 倍:
lcm(26,6) = 78
78/6 = 13
78/26 = 3
然后我得到
13*16 - 3*46 = 70
13*186 - 3*386 = 1260
这与预期的解决方案完全相同,但相差 2 倍。根据测试用例的编写方式,这可能会通过或不会通过。
无论如何,我认为在这里使用整数数学并确保不会发生舍入很重要。
所以,我突然想到,如果您只使用 26*6 而不是 lcm,则可以考虑因子 2:
26*6 = 156
156/6 = 23 (obviously)
156/26 = 6 (obviously)
然后我得到
26*16 - 6*46 = 140
26*186 - 6*386 = 2520
所以换句话说,你只是被期望,而不是这样做:
matrix[i][j] -= faktor * matrix[position][j];
做
matrix[i][j] = matrix[i][j]*matrix[position][position] - matrix[i][position]*matrix[position][j];
您未通过测试用例,因为您盲目地使用浮点数学,而没有考虑必须使用整数的事实。
我无法解决您的问题,但是您的代码中有一些逻辑错误。您没有使用数组的给定参数迭代数组矩阵。在我的示例方法printMatrix中看看如何正确地做到这一点。
例如,您的代码从不使用变量z。
还有一种更简单的方法来初始化多维数组。请看一下我的示例方法getExampleA和getExampleB。
package test;
public class Static {
public static long[][] getExampleA() {
long[][] matrix = new long [3][3];
matrix[0][0] = 7; matrix[0][1] = 17; matrix[0][2] = 29;
matrix[1][0] = 0; matrix[1][1] = -26; matrix[1][2] = -46;
matrix[2][0] = 0; matrix[2][1] = -6; matrix[2][2] = -16;
return matrix;
}
public static long[][] getExampleB() {
long[][] matrix = {{7, 17, 29}, {0, -26, -46}, {0, -6, -16}};
return matrix;
}
public static void printMatrix(long[][] matrix) {
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println("");
}
System.out.println("");
}
public static void main(String[] args) {
printMatrix(getExampleA());
printMatrix(getExampleB());
}
}