【文件属性】:
文件名称:自定义的矩阵类,内含源码与测试工程
文件大小:39KB
文件格式:RAR
更新时间:2015-01-13 13:23:56
自定义 矩阵类 源码
实现有两个类
CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据
CMatrix 实现的矩阵类
使用的时候包含#include "Matrix.h"就行
CMatrix的接口函数都在"Matrix.h"里面
CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h"
具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的
内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。
注意:
1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0)
2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减
提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。
3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏
#define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) )
正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut
鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值
=================================================附录:接口函数==========================================================================
开放的接口:
CVector
//构造函数
CVector();
virtual ~CVector();
CVector(const size_t &nSize;);
CVector(const CVector & vIn);//拷贝构造函数
CVector(const double* const pData,const size_t &nSize;);
CVector(const float* const pData,const size_t &nSize;);
CVector(const int* const pData,const size_t &nSize;);
//公开的成员函数
double at(const size_t& uIndex)const;//作右值
BOOL push_back(const double& dbIn );
BOOL resize(const size_t& nSize);
size_t size()const;
//重载操作符
double& operator()(const UINT& uIndex);//重载()运算符,可作左值
//重载的运算符
double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值
CVector& operator=(const CVector &);//重载=运算符
double operator*(const CVector & )const;//重载*运算符,两向量相乘
CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha
CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha
CVector operator+(const CVector & )const;//重载+运算符,向量加上向量
CVector& operator+=(const CVector & );//重载+=算符,向量加上向量
CVector operator-(const CVector & )const;//重载+运算符,向量加上向量
CVector& operator-=(const CVector & );//重载+=算符,向量加上向量
CVector operator+(const double α)const;//重载+运算符,向量加上实数alpna
CVector& operator+=(const double α);//重载+=算符,向量加上实数alpha
BOOL operator==(const CVector &)const;//重载==运算符
BOOL operator!=(const CVector &)const;//重载!=运算符
CMatrix
//构造函数
CMatrix();
virtual ~CMatrix();
CMatrix(const CMatrix&);//拷贝构造函数
CMatrix(const size_t& n);//产生n阶单位阵
CMatrix(const size_t& nrow, const size_t& ncol);//
CMatrix(const size_t& nrow, const size_t& ncol,const CVector& xdata);//产生nrow行,ncol列矩阵数据由xdata初始化
CMatrix(const size_t& nrow, const size_t& ncol,const double*const pData);
CMatrix(const size_t& nrow, const size_t& ncol,const float* const pData);
CMatrix(const size_t& nrow, const size_t& ncol,const int* const pData);
//公开的成员函数
double At(const size_t& xr,const size_t& xc) const;//这个只能作为右值
CMatrix Trans()const;//A.T()返回矩阵A的转置副本
CVector diag()const;//矩阵上三角化后的对角向量//以此求矩阵的秩,矩阵的行列式等
double det()const;//求矩阵行列式
size_t rank()const;//矩阵的秩
CMatrix Inv()const;//求逆矩阵
inline BOOL IsNullMatrix()const{ return (BOOL)(m_nRowlen==0 || m_nCollen == 0);};//是否是空矩阵
BOOL IsSingularMatrix()const;//是否是奇异矩阵//即行列式为0
友函数
//科学计数法输出//想看较精确的数据的时候
friend void void PrintOut(const CMatrix& M,const size_t& nprecision = 6,std::ostream& os = std::cout);
//产生的随机方阵,一般会是非异阵,供测试用
friend CMatrix randMatrix(const size_t &uSize;,int MAX);//随机产生n阶的方阵
//--------------------------重载部分-Overloaded Part----------------------------------
CMatrix& operator=(const CMatrix &);//重载=赋值运算符
double& operator()(size_t xr,size_t xc);//重载()运算符,A(i,j)即矩阵A的i行j列的元素,
friend std::ostream & operator<<(std::ostream & ,const CMatrix &);//重载<<,可用cout输出矩阵
friend std::ostream & operator<<(std::ostream & ,const CVector&);//重载<<,可用cout输出向量
friend std::istream & operator>>(std::istream & CMatrix &);//重载>>,可用cin输入矩阵
CMatrix operator*(const double α)const;//重载*运算符,矩阵乘以实数alpha
CVector operator*(const CVector &)const;//重载*运算符,矩阵乘以向量
CMatrix operator*(const CMatrix &)const;//重载*运算符,矩阵相乘
CMatrix& operator*=(const CMatrix &);//重载*=运算符
CMatrix operator^(const int α)const;//重载^幂运算符,A^alpha,alpha可以为负整数
CMatrix operator+(const CMatrix &)const;//重载+运算符,矩阵相加
CMatrix& operator+=(const CMatrix &);//重载+=运算符
CMatrix operator-(const CMatrix &)const;//重载-
CMatrix& operator-=(const CMatrix &);//重载-=运算符
BOOL operator==(const CMatrix &)const;//重载==运算符,判断矩阵是否相等
BOOL operator!=(const CMatrix &)const;//重载!=运算符,判断矩阵是否不相等
CVector operator/(const CVector &)const;//重载/除运算符,向量左除矩阵,求Ax=b的x向量
【文件预览】:
TestMatrix
----Matrix.h(4KB)
----Main.cpp(5KB)
----TestMatrix.dsp(6KB)
----TestMatrix.plg(2KB)
----Vector.h(3KB)
----Vector.cpp(8KB)
----TestMatrix.dsw(545B)
----Matrix.cpp(19KB)
----readme.txt(5KB)
----randMatrix.txt(350B)
----TestMatrix.ncb(113KB)
----file1.txt(17B)