本次实验内容为课程作业,计算成绩。你需要将 C++ 源代码、可执行程序(注明运行环境)和实验文档 上传至学在浙大,并将压缩包命名为lab3-学号-姓名.rar/zip
。
本次作业提交截止时间:2024 年 3 月 31 日 23:59:59,逾期将要扣分。
请使用 C++ 语言作为编程语言。
本实验要求自行实现一种稀疏矩阵。推荐的稀疏矩阵存储方式包括:
同学们请基于 sparse.h 实现 Sparse
类,并在实验报告中明确指出自己实现的稀疏矩阵方式。要求保证实现的 Sparse
类至少具备以下的几种最基本的 public
成员函数:
at(row, col)
: 根据row
和column
的系数来查询矩阵里面的元素的数值,即查询矩阵 A
的元素 A[row][col]
insert(val, row, col)
: 将 val
替换/插入到 (row, col)
这个位置去initializeFromVector(rows, cols, vals)
: 根据向量来初始化一个稀疏矩阵。其中 rows
, cols
, vals
皆为等长度的向量。rows
里面存的是行系数,cols
里面存的是列系数,vals
里面存的是数值。例如,vals[i]
对应的就是 A[rows[i]][cols[i]]
的值为了便于同学们的实现,对矩阵做出以下约定:
int
1e-10
以内,即如果一个矩阵元素的绝对值小于 1e-10
,则可以认为它就是 0备注:关于 CRS 与 CSC 的实现实现方式可以参考下面的网站:
此外,有兴趣的同学也可以尝试将自己的实现与 Eigen Library 的 Sparse Matrix 进行比较,看是自己的实现比较高效还是 Eigen Library 的实现比较高效。
本实验要求在自己实现的稀疏矩阵的表达的基础上,实现 Gauss-Seidel 方法,用于求解大规模的稀疏线性方程组。
关于 Gauss-Seidel 方法的介绍已经在课件中进行了详细的介绍。请同学们参照课件,基于 hw3_solve.h 所定义的接口 Gauss_Seidel(A, b, error)
进行代码的编写,其中有
此外还有一些额外的辅助资料提供参考:
作为验证实现的正确性,这里给出一个小的Test Case:
求解得到的结果应该为:
x = [1, 2, -1, 1];
有余力的同学可以参考相关资料实现共轭梯度法求解线性方程组。
维基百科上有比较详细的共轭梯度法的介绍:Conjugate gradient method
希望完成该 bonus 的同学请基于 hw3_solve.h 所定义的接口Conjugate_Gradient(A, b, error, kmax)
进行代码的编写,其中有
可以利用 main.cpp 进行一个最基本的测试,验证自己的稀疏矩阵的实现是否成功、G-S 迭代(和共轭梯度法,可选)的求解是否正确。这个样例程序只是进行了最基本的测试,批改时会进行更复杂的测试,也欢迎大家提交自己补充的测试代码。
可以使用 makefile 编译,给出一个参考的 makefile 文件。
在这里重新列出所有提供的模板代码: