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

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 没有分配内存空间

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