1前言
今日所推文章得头条已经对所求解的模型和算法进行了简单的说明,此处不再赘述。在我们工科学生中用C++进行数值计算的貌似不多,但是许多的工科软件底层都是用C++或部分使用C++。C++作为一门广泛使用的语言,长久不衰。由于其学习成本偏高,很多人只是将其作为C with Class使用,有点大才小用。其实C++支持多种编程范式,例如面向过程、基于对象(带类的C)、面向对象(封装、继承、多态)、泛型,应用自由灵活多变,这也是其学习成本高的原因。但是,领悟了C++这些设计理念,再看看EOF的23种设计模式,上手其他语言就轻松加愉快了。本文采用C++语言、GCC6.2.0编译器进行求解。本期文章中已经有一篇采用C++(Eigen库)进行求解了,为何还要再写一篇了。因为C++很自由,对于同一个问题,其可以采用各种不同的方式进行实现。写完C++(Eigen库)后,其求解效率过低,加上没用上指针、引用等C++语言特性,不足以体现其强大,故而从新写了一篇,大量使用C++指针、引用、new、delete、模板、重载、STL、友元等语言特性,自己编写矩阵类Matrix及其成员函数,利用allocator类(STL)对内存进行精细管理,以达到提高效率的目的。哪为什么不用C++的内置数组?因为C++内置数组是在栈空间开辟内存,栈空间内存有限,不能够满足本程序中大型矩阵的保存和求解工作,allocator类是在堆空间开辟内存,内存管理稍微麻烦,但是可以进行大量数据的保存和运算。鉴于本文源码太长,微信中不便于观看,部分实现细节没有展示,如果需要源码,转发本文,将截图放到评论区,并留下邮箱,将会得到本文源码。
2矩阵类
使用模板特性,你就可以通过一个类生成整数数组、小数数组、字符数组等,而不需要对每种数组设计相应的类。通过友元重载输出操作符<
template<typename T> class Matrix;
template<typename T>
ostream& operator<< (ostream&, const Matrix<T>&);
template<typename T>
class Matrix
{
friend ostream& operator<< <>(ostream&, const Matrix<T>&);//友元函数
private:
T * matrix;
int nx;
int ny;
void _create(T temp);//内存申请 与 矩阵初始化
public:
allocator<T> alloc;
void _free();//矩阵销毁与内存回收
Matrix(int x=1,int y=1,T=1);//构造函数 默认初始化为全1矩阵
Matrix& operator =(const Matrix &);//重载赋值运算操作符
Matrix(const Matrix &);//复制构造函数
~Matrix();//析构函数
T& operator ()(int ,int);//重载() 可以实现array(i,j)的方式访问矩阵元素
T& operator ()(int ,int) const;// 函数重载
int rows(){ return nx;}//返回行数
int cols(){ return ny;}//返回列数
void swap(int rowup,int coldown);//行交换函数
void operator * (int a);//重载乘号 与系数相城
void operator * (const Matrix&);//重载 乘号 与矩阵相乘
void row_multiply(int firstrow,int secondrow,float a);//实现初等变换
int max_row(int col);//返回某列中绝对值最大的行
};
#include"M