12.25矩阵相乘真题和矩阵快速幂及其应用

矩阵相乘

 真题输入两个矩阵,a,b,输出矩阵相乘的结果c

#include <stdio.h>
#define N 100
int a[N][N],b[N][N],c[N][N];
int m,n,k;
int multi(int u,int v){
    int sum=0;
    for(int j=0;j<m;j++) {
        sum+=(a[u][j]*b[j][v]);
    }
    return sum;
}
int main(){
    scanf("%d",&n);
    scanf("%d",&m);
    scanf("%d",&k);
    for(int i=0;i<n;i++){//输入n*m的矩阵
        for(int j=0;j<m;j++)
            scanf("%d",&a[i][j]);
    }
    for(int i=0;i<m;i++){//输入m*k的矩阵
        for(int j=0;j<k;j++)
            scanf("%d",&b[i][j]);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++)
            c[i][j]=multi(i,j);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++)
            printf("%d ",c[i][j]);
        printf("\n");
    }
}

矩阵快速幂

n个N阶矩阵相乘  A的n次方 复杂度O(N^3logn)

#include <stdio.h>
#define N 100
int** multi(int **a,int **b)
{
    int c[N][N]={[0 ... (N-1)][0 ... (N-1)] =0 }; /* 100*100个元素都初始化为10 */
    //memset(c.m,0,sizeof(c.m));
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
           for(int k=0;k<N;k++)
               c[i][j]+=a[i][k]*b[k][j];
       return c;
}
int** pow_matrix(int** a,int n)
{
     int c[N][N]={[0 ... (N-1)][0 ... (N-1)] =1 };
    while(n)
    {
        if(n&1)
            c=multi(c,a);
        n>>=1;
    }
    return c;
}
int main(){
    int a[N][N];
    int m,n;
    scanf("%d",&n);
    scanf("%d",&m);
   // scanf("%d",&k);
    for(int i=0;i<n;i++){//输入n*m的矩阵
        for(int j=0;j<m;j++)
            scanf("%d",a[i][j]);
    }
    pow_matrix(a,3);
}

忘记了二维数组的传递和返回啊啊啊,搞了半天没搞出来,求助大佬。

神奇应用:矩阵快速幂加速递推

根据递推关系改写,在纸上算出A矩阵,然后利用快速幂,计算A的n次方的左下角就是斐波那契数列的Fn。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值