矩阵乘法的递归算法

#include<stdio.h>
#define N 2
void matrix_multiply(int a[][N],int ia,int ja,int b[][N],int ib,int jb,int c[][N],int ic,int jc,int n)
{
    
    if(n==1)
        c[ic][jc]+=a[ia][ja]*b[ib][jb];
    else
    {
        matrix_multiply(a,ia    ,ja    ,b,ib    ,jb    ,c,ic    ,jc,n/2);
        matrix_multiply(a,ia    ,ja+n/2,b,ib+n/2,jb    ,c,ic    ,jc    ,n/2);
        
        matrix_multiply(a,ia    ,ja    ,b,ib    ,jb+n/2,c,ic    ,jc+n/2,n/2);
        matrix_multiply(a,ia    ,ja+n/2,b,ib+n/2,jb+n/2,c,jc    ,jc+n/2,n/2);
        
        matrix_multiply(a,ia+n/2,ja    ,b,ib    ,jb    ,c,ic+n/2,jc    ,n/2);
        matrix_multiply(a,ia+n/2,ja+n/2,b,ib+n/2,jb    ,c,ic+n/2,jc    ,n/2);
    
        matrix_multiply(a,ia+n/2,ja    ,b,ib    ,jb+n/2,c,ic+n/2,ic+n/2,n/2);
        matrix_multiply(a,ia+n/2,ja+n/2,b,ib+n/2,jb+n/2,c,ic+n/2,jc+n/2,n/2);

    }
}

int main()
{
    int n=N;
    int a[n][n];
    int c[n][n];
    int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            a[i][j]=i*n+j;
            c[i][j]=0;
        }
    }

    printf("A:\n");

    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    

    matrix_multiply(a,0,0,a,0,0,c,0,0, n);
    
    printf("matrix_multiply:\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",c[i][j]);
        }
        printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/limengjuhanxin/article/details/58706659