問題は、速度が非常に遅く、ひどく遅く、小さな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
}
あなたの行列のサイズを考えると、私はそれらが疎行列(ほとんどゼロ)であると推測しています。あなたはそのように扱うならば、多くの時間とスペースを節約することができます。 – doron
行列の乗算への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
https://stackoverflow.com/questions/12922031/recursive-matrix-multiplication –