矩阵乘法

矩阵乘法是一种高效的算法可以把一些一维递推优化到log( n),还可以求路径方案等,所以更是是一种应用性极强的算法。矩阵,是线性代数中的基本概念之一。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。矩阵乘法看起来很奇怪,但实际上非常有用,应用也十分广泛。
它是这样定义的,只有当矩阵 A 的列数与矩阵 B 的行数相等时 A × B 才有意义。一个 m × n 的矩阵 a(m , n )左乘一个 n × p 的矩阵 b(n , p ),会得到一个 m × p 的矩阵 c(m , p ),满足
  矩阵乘法满足结合律,但不满足交换律
  一般的矩乘要结合快速幂才有效果。(基本上所有矩阵乘法都要用到快速幂的)
  在数学中,一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
矩阵乘法的c语言程序:
#include<stdio.h>
  float main()
  
{
      float a[100][100],b[100][100],c[100][100];//定义三个数组,分别存储矩阵A,B,C
      int m1,n1,m2,n2,i1,j1,i2,j2,i3,j3,i4,j4,k;
      float s[100][100]={0};//赋值使数组s元素初值全部为零
      printf("请输入矩阵A行数m1,列数n1:");//输入矩阵A行数,列数
      scanf("%d,%d",&m1,&n1);
      printf("请输入矩阵B行数m2,列数n2:");//输入矩阵B行数,列数
      scanf("%d,%d",&m2,&n2);
      printf("\n\n");//如果不可以相乘,下面将出现判断,在此换行,便于观看
      if(n1!=m2)
          printf("不可以相乘!!!");//判断是否可以相乘
      printf("\n\n");
      if((m1>100)||(n1>100))
          printf("数目过多!!!");//控制矩阵A元素数量在数组容纳范围内
      else
          {
          for(i1=1; i1<=m1; i1++)
              {
              for(j1=1; j1<=n1; j1++)
                  {
                  printf("a[%d][%d]=:",i1,j1);
                  scanf("%f",&a[i1][j1]);//输入矩阵A元素
                  
            }
              
        }
          
    }
      printf("\n");//分隔开A,B的元素输入,便于观看
      if((m2>100)||(n2>100))
          printf("数目过多!!!");
      else
          {
          for(i2=1; i2<=m2; i2++)
              {
              for(j2=1; j2<=n2; j2++)
                  {
                  printf("b[%d][%d]=:",i2,j2);
                  scanf("%f",&b[i2][j2]);//输入矩阵B元素
                  
            }
              
        }
          
    }
      printf("矩阵A:\n");//输出矩阵A,便于观看,检验
      for(i3=1; i3<=m1; i3++)
          {
          for(j3=1; j3<=n1; j3++)
              {
              printf("%f ",a[i3][j3]);
              if(j3==n1)
                  printf("\n");
              
        }
          
    }
      printf("\n");//与矩阵B的输出结果隔开,便于观看
      printf("矩阵B:\n");//输出矩阵A,便于观看,检验
      for(i4=1; i4<=m2; i4++)
          {
          for(j4=1; j4<=n2; j4++)
              {
              printf("%f ",b[i4][j4]);
              if(j4==n2)
                  printf("\n");
              
        }
          
    }
      printf("\n");
      printf("矩阵C=A*B:\n");
      for(i4=1; i4<=m1; i4++)
          {
          for(j4=1; j4<=n2; j4++)
              {
              for(k=1; k<=n1; k++)
                  {
                  s[i4][j4]=s[i4][j4]+a[i4][k]*b[k][j4];//定义矩阵乘法,相乘时,有一个指标是一样的,都用k
                  
            }
              c[i4][j4]=s[i4][j4];//定义矩阵乘法
              printf("%f ",c[i4][j4]);
              if(j4==n2)
                  printf("\n");//控制在列指标到达N时换行
              
        }
          
    }
      return 0;
      
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值