矩阵加法运算

问题描述

将稀疏矩阵A的非零元以行序为主序的顺序存于一维数组V中,并用二维数组B表示A中的相应元素是否为零元素,例如:
[ 15 0 0 22 0 − 6 0 0 9 0 0 0 ] (矩阵A) \left[ \begin{matrix} 15 & 0 & 0 & 22 \\ 0 & -6 & 0 & 0 \\ 9 & 0 & 0 & 0 \\ \end{matrix} \right] \tag{矩阵A} 15090600002200(A)

可用 V = (15 , 22 , -6 , 9)
[ 1 0 0 1 0 1 0 0 1 0 0 0 ] (矩阵B) \left[ \begin{matrix} 1&0&0&1\\ 0&1&0&0\\ 1&0&0&0\\ \end{matrix} \right] \tag{矩阵B} 101010000100(B)
编程实现上述表示法的矩阵加法运算。

输入格式

首先输入两个整数n和m,为矩阵维数,然后输入两个矩阵的值B1、V1和B2、V2。

输出格式

输出矩阵运算结果B、V。

样例输入

3 4
1 0 0 1
0 1 0 0
1 0 0 0
15 22 -6 9
0 1 1 0
0 1 1 0
1 0 0 1
3 2 6 2 -5 8

样例输出

1 1 1 1
0 0 1 0
1 0 0 1
15 3 2 22 4 8

提示

定义矩阵结构体,成员变量包括行数、列数、有效元素个数、单位矩阵、有效元素

C语言代码实现

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define MAXSIZE 10 //规定矩阵行数和列数最大值
#define ERROR -1 //定义ERROR宏名
#define OK 1 //定义OK宏名
typedef int Status; //重命名int类型
typedef struct Matrix
{//定义矩阵结构体
	int i,j,tn; //i表示行,j表示列,tn表示有效元素数量
	int range[MAXSIZE][MAXSIZE]; //表示矩阵代表的单位矩阵
	int *data; //存放有效元素的数组
}Matrix;

Status CreatMatrix (Matrix *M , int i , int j); //创建矩阵
Status AddMatrix (Matrix M, Matrix N, Matrix &Q); //矩阵加法运算

int main()
{
	int i,j,m,n,r; //i表示行,j表示列,m、n、r、变量进行for循环
	printf("请输入矩阵行数,列数:\n");
	scanf("%d %d",&i,&j);
	Matrix M,N,Q;
	CreatMatrix (&M,i,j);
	CreatMatrix (&N,i,j);	
	AddMatrix (M,N,Q);
	printf("加法矩阵:\n");
	for(m=0; m<i; m++)
	{//遍历输出结果矩阵Q的单位矩阵
		for(n=0; n<j; n++)
			printf("%d ",Q.range[m][n]);
		printf("\n");
	}
	for(r=0; r<Q.tn; r++)
		printf("%d ",Q.data[r]); //遍历输出有效元素
		
	return 0;
}

Status CreatMatrix (Matrix *M , int i , int j)
{//创建i行j列的矩阵M
	int m,n,r,cont=0; //cont变量记录有效元素的个数
	printf("请输入单位矩阵:\n");
	for(m=0; m<i; m++)
		for(n=0; n<j; n++)
		{//双重循环输入单位矩阵,并累计有效元素个数
			scanf("%d",&M->range[m][n]);
			if(M->range[m][n] == 1)
				cont++;
		}
	
	M->data = (int*)malloc(cont*sizeof(int));
	if(!M->data)
		return ERROR;

	printf("请输入有效值:\n");
	for(r=0; r<cont; r++) //循环输入有效元素
		scanf("%d",&M->data[r]);
	M->i = i; 
	M->j = j;
	M->tn = cont;	
	return OK;
}

Status AddMatrix (Matrix M, Matrix N, Matrix &Q)
{//Q = M + N;矩阵的加法运算
	int m,n,p,q,r,Mt,Nt,val;
	Mt = Nt = val = 0;
	Q.data = (int*)malloc(M.i*M.j*sizeof(int));
	if(!Q.data)
		return ERROR;

	Q.i = M.i;
	Q.j = M.j;
	Q.tn = 0;
	
	for(m=0; m<M.i; m++ )
		for(n=0; n<M.j; n++)
		{//得到矩阵M,range二维数组由单位矩阵变成矩阵
			if( M.range[m][n] == 1)
			{
				M.range[m][n] = M.range[m][n]*M.data[Mt]; 
				Mt++;
			} 
				
		}
	
	for(p=0; p<N.i; p++)
		for(q=0; q<N.j; q++)
		{//得到矩阵N
			if( N.range[p][q] )
			{
				N.range[p][q] = N.range[p][q]*N.data[Nt];
				Nt++;
			}
		}
	
	for(m=0; m<M.i; m++)
		for(n=0; n<M.j; n++)
		{//矩阵M和矩阵N的二维数组对应位置元素相加,得到矩阵Q
			val = M.range[m][n] + N.range[m][n];
			if(val) //如果相加值不为0
			{
				Q.data[Q.tn] = val; //记录进矩阵Q的data数组
				Q.range[m][n] = 1; //更新矩阵Q的range数组为单位矩阵
				Q.tn++; //有效元素个数更新
			}
			else //如果相加值为0
				Q.range[m][n] = 0;
		}
	return OK;	
}

调试

  1. 编写代码过程注意细节,特别是循环编写
  2. 先利用printf函数从主函数开始进行检查,找到问题所在,再利用调试,找到具体问题所在
  3. 当想要利用函数改变传入参数的值,需要传入地址,则可以选择
1. Status CreatMatrix ( Matrix &M , int i , int j );
//调用时
	CreatMatrix ( M , i , j );
2. Status CreatMatrix ( Matrix *M , int i , int j );
//调用时
	CreatMatrix ( &M , i , j );
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值