Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个矩阵乘法函数会产生不正确的输出?_Java_Matrix Multiplication - Fatal编程技术网

Java 为什么这个矩阵乘法函数会产生不正确的输出?

Java 为什么这个矩阵乘法函数会产生不正确的输出?,java,matrix-multiplication,Java,Matrix Multiplication,我当前的实现如下所示,根据这里的评论,从中提取并修改为使用异或而不是添加。假设所有输入矩阵为4x4(并且,对于本实施的目标,可接受) /** * Produces the product of two matrices, treating the first parameter as the "left" matrix. */ public static int[][] multiplyMatrices(int[][] a, int[][] b) { int[][] resultMatr

我当前的实现如下所示,根据这里的评论,从中提取并修改为使用异或而不是添加。假设所有输入矩阵为4x4(并且,对于本实施的目标,可接受)

/**
* Produces the product of two matrices, treating the first parameter as the "left" matrix.
*/
public static int[][] multiplyMatrices(int[][] a, int[][] b)
{
    int[][] resultMatrix = new int[4][4];
    for (int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            for(int k = 0; k < 4; k++)
            {
                resultMatrix[i][j] = resultMatrix[i][j] ^ multiplyPolynomials(a[i][k], b[k][j]);
            }
        }
    }
    return resultMatrix;
}
运行
multilymatrices
后,
resultMatrix
作为
reduceMatrix
的参数传递,定义如下,第二个参数为0x011b。(
tobistring
只是
Integer.toBinaryString
的快捷方式)

有了这些输入,输出矩阵(十六进制,约化模0x011b)为:

但是,手动完成还原会产生不同的结果:

06 af 55 7c
b7 e0 4b ca
a7 35 2e a1
66 3d 06 5c
因此,很明显,编写的程序工作不正常。但是,以下第二个输入矩阵(使用相同的第一个矩阵)返回正确的结果:

30 ca 96 24
32 92 09 23
3f ca 43 63
7d 5a f8 96
上述输入的预期(和收到的)结果如下:

74 b2 97 d8 
68 ea b9 51 
fb 39 0a 60 
a7 a9 00 1b 

显然,
多矩阵
的输出并不是所有情况下的预期结果。所使用的矩阵乘法算法似乎对链接问题的海报起到了作用,我之前已经验证了
multiplypolynomals
的效果与预期相符。多重矩阵输出不准确的最可能原因是什么?为什么有些输入会产生正确的输出?

您必须明确解释这些函数的作用,特别是
multiplypolymals
modulereduce
。您的
multiplypolymals
函数似乎是普通整数乘法的一个冗长的重新实现。如果在GF(256)中这应该是乘法,那么它看起来就不对了。添加了解释每个方法用途的注释。我对GF(256)中系数mod 2的乘法的理解是,它是通过一系列左移位和XOR运算完成的,而且,当使用系数mod 2时,XOR等价于加法。
+
不是您想要的特殊加法。这是普通的整数加法,不是系数为mod 2的压缩多项式加法。不幸的是,在
多重多项式
多重多项式
中用=a^b替换+=对某些输入有效,但对其他输入无效。这似乎是朝着正确的方向迈出的一步,但还没有完全实现。你必须明确地解释这些函数应该做什么,特别是
multiplypolymals
modulereduce
。您的
multiplypolymals
函数似乎是普通整数乘法的一个冗长的重新实现。如果在GF(256)中这应该是乘法,那么它看起来就不对了。添加了解释每个方法用途的注释。我对GF(256)中系数mod 2的乘法的理解是,它是通过一系列左移位和XOR运算完成的,而且,当使用系数mod 2时,XOR等价于加法。
+
不是您想要的特殊加法。这是普通的整数加法,不是系数为mod 2的压缩多项式加法。不幸的是,在
多重多项式
多重多项式
中用=a^b替换+=对某些输入有效,但对其他输入无效。这似乎是在正确的轨道上迈出的一步,但还没有完全实现。
10 26 03 15
23 41 33 04
51 32 14 43
12 12 12 12
06 af 55 7c
b7 e0 4b ca
a7 35 2e a1
66 3d 06 5c
30 ca 96 24
32 92 09 23
3f ca 43 63
7d 5a f8 96
74 b2 97 d8 
68 ea b9 51 
fb 39 0a 60 
a7 a9 00 1b