- 实验目的
- 掌握并学会运用数组及相关知识
- 掌握矩阵相关运算的代码实现
- 学会小组的分工与合作
- 体会封装的好处
- 实验任务及要求
要求实现矩阵的计算器,能供用户选择不同菜单,进而实现不同存储形式及调用相应计算的算法,并记录运算过程。
运算程序主要包括:①矩阵的加减于数乘;②矩阵的转置;③矩阵的乘法;④矩阵的n次方;⑤矩阵的行列式的值。
- 小组成员及分工:
三、本人负责板块
实验侧重点:矩阵的n次方,代码的分析及改错
主要思想:
只有方阵才可以进行矩阵的n次方
在得到这一个矩阵之后,首先进行n次的选择
如果n=0,那么就是单位矩阵,只需要令对角线等于1,其他为0
如果n=1,那么就是他本身
当n大于1的时候,n为2是a*a,再之后就是用上一次的结果*a,令一个矩阵d,存为a*a,又它来存储每次的结果,用f=a*d,每次将f的结果给了d用作循环,最后一次f中为矩阵的n次方
编辑
- 系统功能
- 矩阵的加法:用户输入两个矩阵,执行相加操作
- 矩阵的减法:用户输入两个矩阵,执行相减操作
- 矩阵的数乘:用户输入一个矩阵和一个数,执行数乘操作
- 矩阵的转置:用户输入一个矩阵,返回其转置矩阵
- 矩阵的乘法:用户输入两个矩阵,执行相乘操作
- 矩阵的n次方:用户输入一个矩阵与其要进行的次方数
- 矩阵的逆矩阵:用户输入一个矩阵,返回其逆矩阵
- 实验基本原理
1、矩阵的加减:
首先由用户输入两个矩阵,系统进行判断
if(a->row!=b->row||a->col!=b->col)//不符合相加、减条件,进行报错
else{
c->row=a->row; /*符合相加、相减条件,输入矩阵规模参数*/
c->array[i][j].data=0;
c->array[i][j].data=a>array[i][j].data+b->array[i][j].data;
}判断符合后,根据矩阵运算规则进行运算。
2、矩阵的数乘:
用户输入一个矩阵,输入要乘的数(整型)进行运算
c>array[i][j].data=a>array[i][j].data*x
3、矩阵的转置:
实现矩阵转置需要两个矩阵:一个是用户输入的原矩阵,另一个是新定义的矩阵—用来存储转置后的矩阵。原矩阵与转置矩阵的关系主要有两点:
①行数与列数相反
②aij=bji所以在代码实现时,只需要完成这两个任务即可
4、矩阵的乘法:
①首先根据矩阵所学知识a,b分别为两个矩阵,a为m*n的矩阵。b为n*s的矩阵。a的列数必须与b的行相等。
if (a->col!=b->row)/*两个矩阵能否相乘进行判断*/
printf("\n两个矩阵不匹配,不能相乘!");
②满足上述a与b能够相乘的条件之后,首先对想乘之后的c进行行列规模规定
c->row=a->row; /*输入矩阵规模参数*/
c->col=b->col;
③进行完上述操作之后将对c进行赋值,将c变为0矩阵,然后进行a*b的操作
for(i=0;i<c->row;++i)
5、矩阵的n次方:
只有方阵才可以进行矩阵的n次方在得到这一个矩阵之后,首先进行n次的选择。如果n=0,那么就是单位矩阵,只需要令对角线等于1,其他为0;如果n=1,那么就是他本身;当n大于1的时候,n为2是a*a,再之后就是用上一次的结果*a,令一个矩阵d,存为a*a,又它来存储每次的结果,用f=a*d,每次将f的结果给了d用作循环,最后一次f中为矩阵的n次方
6、矩阵的行列式:
①本实验采用,将行列式按第一行展开,第一行各个元素与其对应的代数余子式的乘积之和即为行列式的值
②利用递归的思想,假设计算n阶行列式的值,则需计算n-1阶的代数余子式,也就是n-1阶行列式,......一直递归下去,直至求解2阶代数余子式(行列式),2阶行列式的值则可通过主对角元素乘积与次对角元素乘积之差求得。值得注意的是,代数余子式需判断其正负!
- 实验输入输出数据
用户输入:
编辑
矩阵加减:
编辑
编辑
矩阵的数乘与转置:
编辑
编辑
矩阵的乘法与行列式的值:
编辑
编辑
矩阵的n次方:
编辑
编辑
- 实验过程发生的问题
但是在函数中中采用MulMat(&a,&a,&d); 调用矩阵的乘法函数,却显示
编辑
如果采用MulMat(a,a,d); 却可以
为什么在主函数中调用函数给的参数,需要&,而在函数中却不可以用
- 心得体会
1、编写一个程序时,先从问题出发,梳理有关问题所学知识,搞清楚其中的原理,先用手算进行演示,然后再思考如何用代码实现,以及遇到多种实现方法时那种更简便。
2、小组合作完成一个任务时,要分工合理明确,首先要确定小组使用编译器、使用的编程语言等基本且重要的问题,其次是选择大部分人可以接受并完成代码的难易程度,最后遇到问题共同解决问题,互帮互助,共同成长。