Java 斯特拉森';s算法归零
其想法是创建一个计时器,该计时器将返回执行特定功能所需的时间。我坐下来编写了一个矩阵类和一个Java 斯特拉森';s算法归零,java,algorithm,matrix,Java,Algorithm,Matrix,其想法是创建一个计时器,该计时器将返回执行特定功能所需的时间。我坐下来编写了一个矩阵类和一个Strass函数,该函数应该与我输入的矩阵类相乘 计时器功能工作正常,因为它返回执行Strass功能所需的时间。但是,Strass函数不返回已相乘的矩阵。它是一个全零矩阵。这就好像Strass函数没有给矩阵C赋值一样 例如,乘以2x2矩阵可得出以下结果: 0.00 // P1 0.00 0.00 // the matrix after multiplication 0.00
Strass
函数,该函数应该与我输入的矩阵类相乘
计时器功能工作正常,因为它返回执行Strass
功能所需的时间。但是,Strass
函数不返回已相乘的矩阵。它是一个全零矩阵。这就好像Strass
函数没有给矩阵C赋值一样
例如,乘以2x2矩阵可得出以下结果:
0.00 // P1
0.00 0.00 // the matrix after multiplication
0.00 0.00
7102000 // the time it took to do this
Strass
函数如下所示:
public static void Strass(Matrix A, Matrix B, Matrix C) {
// It has been suggested that P1-P7 should be of size
// A.size()/2. Changing this does not fix the problem.
Matrix P1 = new Matrix(A.size());
Matrix P2 = new Matrix(A.size());
Matrix P3 = new Matrix(A.size());
Matrix P4 = new Matrix(A.size());
Matrix P5 = new Matrix(A.size());
Matrix P6 = new Matrix(A.size());
Matrix P7 = new Matrix(A.size());
// if n = 1 then
if (A.size() == 1) {
C = A.times(B);
} else {
if (A.size() != B.size()) throw new RuntimeException("Somehow, the sizes of the matrices aren't equal.");
int sizeOf = A.size();
// The ungodly recursive calls.
Strass(A.partition(1, sizeOf/2, 1, sizeOf/2).plus(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), B.partition(1, sizeOf/2, 1, sizeOf/2).plus(B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), P1);
Strass(A.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).plus(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), B.partition(1, sizeOf/2, 1, sizeOf/2), P2);
Strass(A.partition(1, sizeOf/2, 1, sizeOf/2), B.partition(1, sizeOf/2, sizeOf/2+1, sizeOf).minus(B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), P3);
Strass(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf), B.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).minus(B.partition(1, sizeOf/2, 1, sizeOf/2)), P4);
Strass(A.partition(1, sizeOf/2, 1, sizeOf/2).plus(A.partition(1, sizeOf/2, sizeOf/2+1, sizeOf)), B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf), P5);
Strass(A.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).minus(A.partition(1, sizeOf/2, 1, sizeOf/2)), B.partition(1, sizeOf/2, 1, sizeOf/2).plus(B.partition(1, sizeOf/2, sizeOf/2+1, sizeOf)), P6);
Strass(A.partition(1, sizeOf/2, sizeOf/2+1, 1).minus(A.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), B.partition(sizeOf/2+1, sizeOf, 1, sizeOf/2).plus(B.partition(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf)), P7);
C.addPart(1, sizeOf/2, 1, sizeOf/2, (P1.plus(P4)).minus(P5.plus(P7)));
C.addPart(sizeOf/2+1, sizeOf, 1, sizeOf/2, (P2.plus(P4)));
C.addPart(1, sizeOf/2, sizeOf/2+1, sizeOf, (P3.plus(P5)));
C.addPart(sizeOf/2+1, sizeOf, sizeOf/2+1, sizeOf, (P1.plus(P3)).minus(P2.plus(P3)));
}
}
我已经测试了addPart
函数,据我所知,它工作正常。加号和减号函数也是如此。我尽了最大努力去检查并验证我在所有正确的位置都有正确的尺寸和号码,我非常确定我有。所以,在这一切的某个地方,有点不对劲
为了便于参考和简洁,我粘贴了所有相关代码。您应该首先使用1x1矩阵乘法进行测试。然后是2x2,然后是4x4。这些都很容易验证。我还想指出,您的代码不处理不是2的幂的矩阵维度,因此不要尝试使用100x100矩阵。同样奇怪的是,P1到P7的大小与A相同。它们不应该是A.size()/2吗?
C=A.times(B)代码>不正确。这会将一个新矩阵分配给C
,它不会修改传入的矩阵对象。您是否对各个矩阵方法进行了单元测试,以验证它们是否得到了正确实现?我已经测试了它们中的每一个,它们似乎也都按照我的预期工作。很明显,我遗漏了一些东西,因为整个事情都不起作用,但它们单独工作似乎很好。它的设计目的是目前只处理2的幂的矩阵,所以没关系。我已经用许多小矩阵维度进行了测试,由于某种原因,结果仍然是零。我已经编辑了这个问题,将矩阵相乘的结果包括在内。我该怎么做才能解决这个问题?(这是我学习Java的一个程序,所以请不要对我太苛刻。)很好。我在那条线上停顿了一下,但不知道为什么。现在我知道了。这取决于你真的希望结果如何返回。我将删除C
作为参数,而将其作为结果返回(如矩阵Strass(矩阵a,矩阵B){…}
)。然后您的基本情况是返回A.times(B)
,并且您的递归调用会根据需要进行更改。如果您只是想让某些东西尽可能简单地工作,请保持原样,并将基本情况更改为类似于C.copy(A.times(B))
。啊哈!数字仍然不正确,但确实有数字。我相信数字上的差异是我自己造成的,所以非常感谢你的回答!