• C语言 矩阵的几种乘法


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

    #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();

    }



  • 相关阅读:
    【校招VIP】[产品][211][5分]项目缺少产品逻辑
    【校招VIP】[java][一本][6分]简历板式的选择需要多加考虑
    【校招VIP】[前端][一本][6分]项目需要考虑到PC端和移动端
    【校招VIP】[产品][211][8分]按需求分类书写简历
    【校招VIP】[产品][985][5分]实习经历无法凸显个人能力
    【校招VIP】[产品][一本][6分]简历原则上写一页
    【校招VIP】[Java][二本][5分]注意简历布局,突出项目重点
    【校招VIP】[前端][二本][6分]简历一线校招通过率较低
    【校招VIP】[Java][二本][5分]开发岗简历项目最好有两个
    OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
  • 原文地址:https://www.cnblogs.com/ikodota/p/matrix_MUL.html
Copyright © 2020-2023  润新知