0

アイデアは、特定の機能を実行するのにかかる時間を返すタイマーを作成することです。私は座って、それにフィードすることを乗算する必要がStrassある行列クラスと関数をコーディングしました。

タイマー関数は、関数の実行にかかる時間を返すという点で正しく機能しStrassます。ただし、このStrass関数は、乗算された行列を返しません。これは、すべてゼロの行列です。これは、Strass関数がMatrixCに何も割り当てていないかのようです。

たとえば、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機能をテストしました、そしてそれは私が知る限り正しく働いています。プラスとマイナスの機能についても同じことが言えます。私は最善を尽くして、すべての適切な場所にすべての適切なサイズと数があることを確認しました。ですから、このすべてのどこかに、何かがおかしいのです。

参考までに、ここに関連するすべてのコードを貼り付けました。

4

2 に答える 2

2

C = A.times(B);間違っています。これにより、新しい行列が に割り当てCられます。渡された行列オブジェクトは変更されません。

于 2012-10-13T02:08:22.857 に答える
0

最初に 1x1 の行列乗算でテストする必要があります。次に 2x2、次に 4x4。これらはすべて簡単に確認できます。また、コードは 2 のべき乗でない行列の次元を処理しないことも指摘しておきます。したがって、100x100 の行列を使用しないでください。また、奇妙なことに、P1 から P7 は A と同じサイズです。それらは A.Size()/2 であるべきではありませんか?

于 2012-10-13T01:51:12.490 に答える