0

下面的代码是我的“消除方法”,它是关于高斯算法的。我正在努力理解为什么我的消除方法不起作用。其他 2 个(表示旋转的 pivotisiere 和表示求解方法的 loese)工作得非常好。我整天都坐在这里试图对其进行编码,但没有找到解决方案,如果有任何帮助,我会很高兴。

该方法应该如何工作:矩阵对角线下方的数字需要转换为“0”,并且与 0(包括向量)在同一行中的其余数字也需要相应地转换。

4

2 回答 2

1

如果我使用 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];

您未通过测试用例,因为您盲目地使用浮点数学,而没有考虑必须使用整数的事实。

于 2020-11-26T09:48:46.917 回答
0

我无法解决您的问题,但是您的代码中有一些逻辑错误。您没有使用数组的给定参数迭代数组矩阵在我的示例方法printMatrix中看看如何正确地做到这一点。

例如,您的代码从不使用变量z

还有一种更简单的方法来初始化多维数组。请看一下我的示例方法getExampleAgetExampleB

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());
    }
}
于 2020-11-26T09:41:26.870 回答