首页 > 编程知识 正文

矩阵加法运算律,矩阵加法运算有分配律吗

时间:2023-05-03 12:26:32 阅读:264830 作者:3750

问题描述

将稀疏矩阵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} ⎣⎡​1509​0−60​000​2200​⎦⎤​(矩阵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} ⎣⎡​101​010​000​100​⎦⎤​(矩阵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列的矩阵Mint 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++){//得到矩阵Nif( 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的二维数组对应位置元素相加,得到矩阵Qval = 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 //如果相加值为0Q.range[m][n] = 0;}return OK;} 调试 编写代码过程注意细节,特别是循环编写先利用printf函数从主函数开始进行检查,找到问题所在,再利用调试,找到具体问题所在当想要利用函数改变传入参数的值,需要传入地址,则可以选择 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五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。