听门外雪花风@ 2020-12-10 21:31 采纳率: 100%
浏览 19
已采纳

c语言代码找错,用函数计算矩阵内积

求救大神

#include<stdio.h>
#include<math.h>
//声明三个矩阵 matri
double **matrix_multiplication(const double **b_matrix,const double **c_matrix,int x,int y,int z)
//a-matrix=b_matrix*c_matrix
//x,b_matrix的列数,c_matrixde的行数
//y,b_matrix的行数
//z,c_matrix的列数
{   double **a_matrix;
    int k1,k2,k3;
    double stem;
    double **a;
    //k1,b_matrix第k1列,c_matrix第k1行
    //k2,b_matrix第k2行
    //k3,c_matrix第k3列
    for(k2=0;k2<y;k2++)
    {
        for(k3=0;k3<z;k3++)
        {
            for(k1=0;k1<x;k1++)
            {
                stem+=b_matrix[k2][k1]*c_matrix[k1][k3];
            }
            a_matrix[k2][k3]=stem;
        }
    }
    a=a_matrix;
    return a;
}

int main()
{
   double **answer;
   double **b;
   double **c;
   int m1,m2,n,l;
   int k1,k2,k3;
   printf("请输入第一个矩阵的行数和列数\n");
   scanf("%d%d",&n,&m1);
   printf("请输入第二个矩阵的行数和列数\n");
   scanf("%d%d",&m2,&l);
   if(m1=!m2)
   {
       printf("两矩阵无法相乘");
   }
   else
    {for(k2=0;k2<n;k2++)
      {
       printf("请输入第一个矩阵第%d行的数据:",k2);
       for(k1=0;k1<m1;k1++)
       {
          scanf("5.2%f",&b[k2][k1]);
       }
      }
     for(k1=0;k1<m2;k1++)
      {
       printf("请输入第一个矩阵第%d行的数据:",k1);
       for(k3=0;k3<l;k3++)
       {
          scanf("5.2%f",&b[k1][k3]);
       }
      }
     answer=matrix_multiplication(b,c,m1,n,l);
     printf("所得矩阵的内积为:\n");
     for(k2=0;k2<n;k2++)
     {
       for(k3=0;k3<l;k3++)
       {
           printf("%5.2f",answer[k2][k3]);
       }
     }
   }
   return 0;
}
 

  • 写回答

1条回答 默认 最新

  • muzibing1221 2020-12-11 20:41
    关注

    1 没有分配内存空间

    2 在计算矩阵的时候没有将

      stem=0.0;还原以及初始化

     

    test.c文件

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    //声明三个矩阵 matri
    double **matrix_multiplication(double **b_matrix, double **c_matrix,int x,int y,int z)
    //a-matrix=b_matrix*c_matrix
    //x,b_matrix的列数,c_matrixde的行数
    //y,b_matrix的行数
    //z,c_matrix的列数
    {   
        double **a_matrix;
        int k1,k2,k3;
        double stem=0.0;
    
        //k1,b_matrix第k1列,c_matrix第k1行
        //k2,b_matrix第k2行
        //k3,c_matrix第k3列
        a_matrix=(double**)malloc(y*sizeof(double*));
    	if(a_matrix==NULL)
    	{
    		return NULL;
    	}
        for(k2=0;k2<y;k2++)
        {
    		a_matrix[k2]=(double*)malloc(x*sizeof(double));
    		if(a_matrix[k2]==NULL)
    		{
    			return NULL;
    		}
            for(k3=0;k3<z;k3++)
            {
                for(k1=0;k1<x;k1++)
                {
                    stem+=b_matrix[k2][k1]*c_matrix[k1][k3];
                }
                a_matrix[k2][k3]=stem;
    			stem=0.0;
    		}
    
        }
    
        return a_matrix;
    }
    
    int main()
    {
    	double **answer;
    	double **b;
    	double **c;
    	int m1,m2,n,l;
    	int k1=0,k2=0,k3=0;
    
    	//printf("请输入第一个矩阵的行数和列数\n");
    	scanf("%d %d",&n,&m1);
    	//printf("请输入第二个矩阵的行数和列数\n");
    	scanf("%d %d",&m2,&l);
    	if(m1!=m2)
    	{
    		printf("两矩阵无法相乘\n");
    		//goto err_0;
    		return 0;
    	}
    	else
    	{
    		printf("n %d m1 %d \n", n, m1);
    		printf("m2 %d l %d \n", m2, l);
    		b=(double**)malloc(n*sizeof(double*));
    		if(b==NULL)
    		{
    			goto err_1;
    		}
    		for(k2=0;k2<n;k2++)
    		{
    			b[k2]=(double*)malloc(m1*sizeof(double));
    			if(b[k2]==NULL)
    			{
    				goto err_1;
    			}
    			//printf("请输入第一个矩阵第%d行的数据:",k2);
    			for(k1=0;k1<m1;k1++)
    			{
    				scanf("%lf",&b[k2][k1]);
    			}
    			//printf("\n");
    		}
    		c=(double**)malloc(m2*sizeof(double*));
    		if(c==NULL)
    		{
    			goto err_2;
    		}
    		for(k1=0;k1<m2;k1++)
    		{
    			c[k1]=(double*)malloc(l*sizeof(double));
    			//printf("请输入第二个矩阵第%d行的数据:",k1);
    			if(c[k1]==NULL)
    			{
    				goto err_2;
    			}
    			for(k3=0;k3<l;k3++)
    			{
    				scanf("%lf",&c[k1][k3]);
    			}
    			//printf("\n");
    		}
    		for(k2=0;k2<n;k2++)
    		{
    			for(k1=0;k1<m1;k1++)
    			{
    				printf("%5.2lf ",b[k2][k1]);
    			}
    			printf("\n");
    		}
    		for(k1=0;k1<m2;k1++)
    		{
    			for(k3=0;k3<l;k3++)
    			{
    				printf("%5.2lf ",c[k1][k3]);
    			}
    			printf("\n");
    		}
    		answer=matrix_multiplication(b,c,m1,n,l);
    		if(answer==NULL)
    		{
    			goto err_3;
    		}
    		printf("所得矩阵的内积为:\n");
    		for(k2=0;k2<n;k2++)
    		{
    			for(k3=0;k3<l;k3++)
    			{
    				printf("%5.2lf ",answer[k2][k3]);
    			}
    			printf("\n");
    		}
    	}
    
    err_3:
    	for(k3=0;k3<k2;k3++)
    	{
    		if(answer[k3]!=NULL)
    		{
    			free(answer[k3]);
    			answer[k3]=NULL;
    		}
    	}
    	if(answer!=NULL)
    	{
    		free(answer);
    		answer=NULL;
    	}
    err_2:
    	for(k3=0;k3<k1;k3++)
    	{
    		if(c[k3]!=NULL)
    		{
    			free(c[k3]);
    			c[k3]=NULL;
    		}
    	}
    	if(c!=NULL)
    	{
    		free(c);
    		c=NULL;
    	}
    err_1:
    	for(k3=0;k3<k2;k3++)
    	{
    		if(b[k3]!=NULL)
    		{
    			free(b[k3]);
    			b[k3]=NULL;
    		}
    	}
    	if(b!=NULL)
    	{
    		free(b);
    		b=NULL;
    	}
    	
    err_0:
    	
    	return 0;
    }
    

    in.txt文件

    3 2   
    2 3   
    8     
    2     
    1     
    2     
    9     
    1     
    8     
    1     
    3     
    3     
    2     
    1     

     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了
  • ¥15 有谁能够把华为matebook e 高通骁龙850刷成安卓系统,或者安装安卓系统
  • ¥188 需要修改一个工具,懂得汇编的人来。
  • ¥15 livecharts wpf piechart 属性
  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题