C语言 矩阵的几种乘法

余生长醉 提交于 2019-12-20 02:31:03

在看到麻省理工学院的线性代数公开课的视频时,了解到有几种矩阵相乘的方法:

#include <stdio.h>#include <stdlib.h>#include <math.h>#define M 2#define N 3#define P 4/* * A*B=C * (M,N) * (N,P) =(M,P) */float a[M][N]   =  {{5, 2,  4},                            {6, 3,  9}};float b[N][P]   =  {{7, 8,  9,  10},                            {1, 4,  22, 171},                            {13,14, 2,  21}};float c[M][P];void clear_c(){//用于清空c数组,//多种乘法同时使用的时候,某些方法需要清空c数组,否则会重复计算。    int i,j;    for(i=0;i<M;i++)        for(j=0;j<P;j++)        c[i][j]=0;}void print_matrix(){//本函数只打印c 矩阵    int i,j;    for(i=0;i<M;i++)    {        for(j=0;j<P;j++)        {            printf("%.3g\t",c[i][j]);        }        printf("\n");    }}void mul_1(){//一般矩阵乘积    printf("\n1.矩阵乘法的一般方法:\n");    int i,j,k;    float c_key,c_sumkey;    //注意三层循环的顺序。    for(i=0;i<M;i++){        for(j=0;j<P;j++){            c_sumkey=0;//清空后计算下一个元素的值            for(k=0;k<N;k++){                c_key=a[i][k]*b[k][j];                c_sumkey+=c_key;                printf("a[%d,%d] x b[%d,%d] = %.3g x %.3g = %.3g\n",i,k,k,j,a[i][k],b[k][j],c_key);            }            c[i][j]=c_sumkey;            printf("相加 =  c[%d,%d] = %.3g\n\n",i,j,c_sumkey);        }    }}float get_key_val(int i,int j){ //求结果矩阵中某点的内积    int n;    float sumkeyval=0;    printf("c[%d,%d] = ",i,j);    for(n=0;n<N;n++){        if(n!=0) printf(" + ");        //printf("a[%d,%d]*b[%d,%d]",i,n,n,j);        printf("(%.3g*%.3g)",a[i][n],b[n][j]);        sumkeyval+=a[i][n]*b[n][j];    }    printf(" =  %.3g\n",sumkeyval);    return sumkeyval;}void mul_2(){//根据定义求矩阵的乘积     printf("\n2.根据定义直接计算:\n");    int i,j;    for(i=0;i<M;i++){        for(j=0;j<P;j++){            c[i][j]=get_key_val(i,j);        }        printf("\n");    }}void show_multi_proc(float x,int  j){//本函数只为显示更详细的乘法过程。    int k;    if(j!=0){printf(" + ");}else{printf(" = ");}    printf("[ ");    for(k=0;k<P;k++)    {        printf("%.3g ",x*b[j][k]);    }    printf("]");}void splite_matrix_row(float x,int i,int  j){//把B矩阵分割成 N个一维数组,长度为p.//并用向量 乘以 数组中的每个值。//然后做矩阵相加,即多个一维数组对应位置相加。并把值写入C矩阵。    int k;    if(j!=0){printf("\n + ");}    printf("%.3g*[ ",x);    for(k=0;k<P;k++)    {        printf("%.3g ",b[j][k]);        c[i][k]+=x*b[j][k];//向量乘以矩阵    }    printf("]");}void mul_3(){//系数-向量方法    //这里只采用了 行向量的方法。列向量也会可行的。    // 或者 把矩阵A分为多个行(列)向量,然后把矩阵B分为系数。     printf("\n3.系数-向量的方法:\n");    int i,j;    float xs;//系数    for(i=0;i<M;i++){        for(j=0;j<N;j++)        {            xs=a[i][j];            splite_matrix_row(xs,i,j);        }         for(j=0;j<N;j++)        {            xs=a[i][j];          show_multi_proc(xs,j);        }        printf("\n");    }}void mul_4(){//行向量与列向量相乘。计算结果为最终矩阵中一个元素的值     printf("\n4.行向量乘以列向量的方法:\n");int i,j,k;    float c_key,c_sumkey;    //注意三层循环的关系。    for(i=0;i<M;i++){        for(j=0;j<P;j++){            c_sumkey=0;//清空后计算下一个元素的值            printf("[");            for(k=0;k<N;k++){                printf(" %.3g ",a[i][k]);            }             printf("].");              printf("[");            for(k=0;k<N;k++){                printf(" %.3g ",b[k][j]);            }             printf("] =");            for(k=0;k<N;k++){                if(k!=0){printf("+ ");}                c_key=a[i][k]*b[k][j];                c_sumkey+=c_key;                printf("%.3g x %.3g ",a[i][k],b[k][j]);            }            c[i][j]=c_sumkey;            printf("= c[%d,%d] = %.3g\n\n",i,j,c_sumkey);        }    }}int main(){    mul_1();    print_matrix();    mul_2();    print_matrix();    clear_c();    mul_3();    print_matrix();    mul_4();    printf("\n");    print_matrix();}



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!