C语言—用malloc函数实现任意阶矩阵的乘法

Strassen的矩阵乘法算法虽然时间复杂度为Θ(n^lg7),比Θ(n^3)小,但是常数项很大,在实际应用中不多见。

When the matrices are sparse, methods tailored for sparse matrices are faster.

下面呈现的算法是最普通的Θ(n^3)

#include<stdio.h>
#include<stdlib.h>/*malloc函数的函数头,如果这个函数头不行,可以试试malloc.h*/
int main(void)
{
 int m,g,n;
 int i,j,k;
 printf("请输入第一个矩阵的行数和列数:\n");
 scanf("%d%d",&m,&g);
    printf("请输入第二个矩阵的列数(该矩阵行数等于第一个矩阵的列数):\n");
 scanf("%d",&n);
 double **a=NULL;/*二级指针用来代表一个二维数组,在声明指针的时候将其赋值为NULL;释放后再赋值为NULL在一些进行有效性判断的地方用a==NULL来判断指针是否为空指针*/
 a=(double**)malloc(m*sizeof(double*));/*这句是动态定义二维数组的行数。新的标准ANSI C规定malloc函数的返回值类型为void型,所以需要强制转化为double型的指针后才能赋给a。*/
 for(i=0;i<m;i++)
  a[i]=(double*)malloc(g*sizeof(double));/*这句是动态定义二维数组的列数。*/
 printf("请输入第一个矩阵中的元素:\n");
 for(i=0;i<m;i++)
  for(j=0;j<g;j++)
   scanf("%lf",&a[i][j]);
 double **b=NULL;
 b=(double**)malloc(g*sizeof(double *));
 for(i=0;i<g;i++)
  b[i]=(double*)malloc(n*sizeof(double));
 printf("请输入第二个矩阵中的元素:\n");
 for(i=0;i<g;i++)
  for(j=0;j<n;j++)
   scanf("%lf",&b[i][j]);
 double **result=NULL;/*存放计算结果的二维数组*/
 result=(double**)malloc(m*sizeof(double*));
 for(i=0;i<m;i++)
  result[i]=(double*)malloc(n*sizeof(double));
 for(i=0;i<m;i++)
  for(j=0;j<n;j++)
   result[i][j]=0;/*初始化为0*/
 for(i=0;i<m;i++)/*完成矩阵的乘法运算*/
  for(j=0;j<n;j++)
   for(k=0;k<g;k++)
   result[i][j]+=a[i][k]*b[k][j];
 printf("结果:\n");
 for(i=0;i<m;i++)
 {
  for(j=0;j<n;j++)
   printf("%5g",result[i][j]);
  printf("\n");
 }
    for(i=0;i<m;i++)/*释放之前分配的空间是一个好习惯*/
   {
free(a[i]);
a[i]=NULL;
free(result[i]);
result[i]=NULL;/*将之前分配的内存空间释放后,把指针置0是一个好的习惯*/
}
free(a);
a=NULL;
free(result);
result=NULL;
for(i=0;i<g;i++)
{free(b[i]);
b[i]=NULL;
}
free(b);
b=NULL;
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值