硬件技术团队编程基础作业
修读过《C程序设计基础》、《线性代数》以及X·Lab硬件技术团队第一次内训或其对应的高阶课程。
本题目的难度对于初学者而言相对较高,主要考察了基础的数学能力、通过编程解决问题的能力以及工程管理、CMake、git等综合能力。该作业的最终得分仅作参考,同学们可根据自己的能力来决定实现哪些函数。
《线性代数》作为浙江大学工科多数专业必修的数学基础课程,对于其掌握是至关重要的,后续各大专业的专业课程也都离不开线性代数。然而,在后续的专业课程学习中,我们往往只需要计算一些矩阵的数值解,这个过程如果用手去计算的话是十分痛苦的。秉承着“我都学编程了就不要自己做一些无意义的事情”的原则,我们决定实现一个线性代数计算库,来辅助我们进行运算。
当然,如MATLAB、Python等高级编程语言已经可以做到这类事情,且做得更好,但这并不妨碍我们通过这样一种方式来锻炼自己的C语言编程能力。
本仓库给出了我们在内训中提到的工程模板,同学们要做的任务如下:
- 自学git,注册GitHub账号,将本仓库在自己的GitHub账户下Fork一份(注意是Fork,禁止直接clone本仓库到本地,否则你将无法完成后续提交),并按照
yourname_hw1
的格式更改仓库名称(在仓库中的Settings处可修改,记得不要用中文,仓库权限为public,如涉及到隐私保护,可设为private,但要将[email protected]
这个账户设置为协作者)。 - 将你的仓库clone到本地。
- 按照内训所讲的工程模板补充所缺的文件夹。
- 根据
inc/algebra.h
中的注释和预定义,在src/algebra.c
中实现对应的函数。 - 根据内训所讲,自行编写
CMakeLists.txt
文件,使你的工程能够在本地成功编译运行。 - 自学Markdown,修改
README.md
文件,需要包含你的实现思路(大致描述即可)以及本地运行截图。 - 将你的修改提交到远程仓库,并将仓库链接提交(提交方式待定)。
见doc
文件夹。
在本题目中,main.c
文件已给出,不需要同学们自己实现,也请不要更改这个文件,否则可能出现判题错误。
本题目采用帧判定的思路进行,每一帧的第一行指令代码,+
、-
、*
、.
、t
、d
、i
、r
、j
分别测试add_matrix
、sub_matrix
、mul_matrix
、scale_matrix
、transpose_matrix
、det_matrix
、inv_matrix
、rank_matrix
、trace_matrix
函数,q
表示退出。
接下来的一行输入矩阵
可能的一次运行输入如下:
+
2 2
1.1 1.3
2.4 3.7
2 2
3.1 4.3
5.1 7.1
+
2 2
1.1 1.2
2.4 3.5
2 3
1 2 2.1
3 2 3.3
q
在每一帧中,依次根据输入的指令代码运行对应的函数,并给出函数的输出与标准值比对。上述输入的正确输出如下:
4.20 5.60
7.50 10.80
Error: Matrix a and b must have the same rows and cols.
- 成功运行:+25分
add_matrix
、sub_matrix
、mul_matrix
、scale_matrix
、transpose_matrix
、trace_matrix
功能正常每个+5分det_matrix
、inv_matrix
、rank_matrix
功能正常每个+15分
为了保证题目难度,每个函数具体的评分标准不予公布。
将你完成任务的GitHub仓库链接通过飞书发送给X-Check机器人,机器人会自动进行打分并将分数返回。参考如下视频:
https://tannin-1316822731.cos.ap-nanjing.myqcloud.com/2024-03-29-827_1711724348.mp4
待定
- 矩阵的加、减、数乘、矩阵乘法、转置、迹的运算不多赘述;
- 矩阵的行列式是通过将第一行展开来求,即遍历第一行元素,求出各自与各自的代数余子式乘积后加和得到;
- 矩阵求逆通过公式$ A^{-1}=\frac{A^{}}{\left |A \right |}$求解,难点在于求$ A^{}$。可先通过二重循环遍历矩阵中每个元素,再通过二重循环遍历他们的余子式,当指标与元素行列索引相同时continue即可;
- 矩阵求秩通过高斯消元法。大的思路就是通过沿着对角线上元素(即行列索引相同的元素,我们姑且称为主元)进行行与行的倍加消去。如果主元为0,则可遍历以主元为左上角元素的子矩阵中是否还有非0元素,有则通过行列变换换到对角线上,无则return当前rank值,接续循环,直至主元遍历完成或子矩阵为全0矩阵。