2017-07-01 12 views
0

問題は、速度が非常に遅く、ひどく遅く、小さなnの下であってもです。たとえば、n = 1024の場合、何か間違いがありますか?除算と征服を使用した行列乗算

私は関数呼び出しのたびに新しい行列Cを作成しませんでした。新しい結果を元の行列Cに格納されている元の結果に追加します。

int **matA,**matB,**matC; 

    void matmul_div_rec(int Arow,int Acol,int Brow,int Bcol,int n) { 
     if(n==1) 
     { 
      matC[Arow][Bcol]+=matA[Arow][Acol]*matB[Brow][Bcol]; 
     } 
     else 
     { 
      matmul_div_rec(Arow+0,Acol+0,Brow+0,Bcol+0,n/2); 
      matmul_div_rec(Arow+0,Acol+n/2,Brow+n/2,Bcol+0,n/2); 
      matmul_div_rec(Arow+0,Acol+0,Brow+0,Bcol+n/2,n/2); 
      matmul_div_rec(Arow+0,Acol+n/2,Brow+n/2,Bcol+n/2,n/2); 
      matmul_div_rec(Arow+n/2,Acol+0,Brow+0,Bcol+0,n/2); 
      matmul_div_rec(Arow+n/2,Acol+n/2,Brow+n/2,Bcol+0,n/2); 
      matmul_div_rec(Arow+n/2,Acol+0,Brow+0,Bcol+n/2,n/2); 
      matmul_div_rec(Arow+n/2,Acol+n/2,Brow+n/2,Bcol+n/2,n/2); 
     } 
     return; } 
int main() 
{ 
    matmul_div_rec(0,0,0,0,n); //n must be the power of 2 

} 
+2

あなたの行列のサイズを考えると、私はそれらが疎行列(ほとんどゼロ)であると推測しています。あなたはそのように扱うならば、多くの時間とスペースを節約することができます。 – doron

+1

行列の乗算へのstrassen方法については、https://stackoverflow.com/questions/4846938/divide-and-conquer-matrix-multiplicationを参照してください。http://www.geeksforgeeks.org/strassens-matrix-multiplication/ http:///www.geeksforgeeks.org/strassens-matrix-multiplication/ – EsmaeelE

+0

https://stackoverflow.com/questions/12922031/recursive-matrix-multiplication –

答えて

0

簡単にはで説明したように、例えば、this紙、ストラッセンのアルゴリズムの実装は、(それが正しくても)いくつかの追加のアイデアを使用している場合にのみ、競争力の性能を有しています。これらは、例えばサブマトリクスをアドレス指定するためのより簡単な方法を得るために、メモリ内のマトリクス記憶のためのいわゆるMorton orderレイアウトを使用し、より良いメモリ局所性を介してキャッシング動作を改善することを含む。さらに、再帰の基本ケースでの行列加算の並列化にSIMDを使用することで潜在的な改善があります。

+0

問題のコードはStrassenではありません。これは、「分裂と征服」再帰的スタイルで書かれた素朴な行列乗算アルゴリズムです。 –