您的位置:首页 > 编程语言 > MATLAB

C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab

2013-09-03 22:26 766 查看
matlab素有矩阵实验室的美称,小弟我学C++刚过一年,不才用C++去尝试写了一个矩阵类模板,现发布出来供大家测试。

由于本课题不含源码(会于后期发布),发布的是dll文件,所以首先我们先讲讲动态库导出类模板的问题(这个非常麻烦),其他在动态库中导出函数和普通类请大家自行问度娘,我就不啰嗦了,我直接说说最麻烦的东西。

模板类是一个编译链接期间才实例化的类。只有用到才实例化。标准没有支持对模板类的导出,从另外一种意义上来说,模板类的实现全部放在头文件中,也就不需要导出了。但是对于一些特别情况。模板类中有静态变量和函数。这个时候DLL中使用的,以及和其他链接这个DLL的模块他们是使用的两份拷贝。

比如, 在DLL中这样使用:

T * pDLL = Singlton<T>::Get();

然后再链接这个DLL的exe中

T * pEXE = Singlton<T>::Get();

两处得到的pDLL 和 pEXE 是不一样的,因为模板类没有导出,所以他们使用的是两份实例代码。暂时还没有export 一个模板类的方法。

但是鉴于上述的情况,可以在定义T的DLL中显示的实例化模板类 Singlton<T> , 如下实例化,

template class Singlton<T>;

C++标准规定:“当一个类模板被显式实例化时,它的所有成员函数都将实例化。”(When   a   class   template   is   explicitly   instantiated,   every   member   function   is   also   instantiated)

所以现在可以做的就是导出这个被我们显式实例化了的类, 如下语句

template class __declspec(dllexport) Sington<T>;

上述东西看似不长,但是很难找,现在我们言归正传,下面来看矩阵类的定义:
template<class T>
class CRectangle{
public:
CRectangle(int x,int y);
CRectangle(T *arry,int x,int y);
~CRectangle(){};

/*输入输出*/
void in();
void out();

/*操作函数*/
bool check_position(int x,int y);               //检查是否有这个位置
void change_value(int x,int y,T value);         //赋值函数
int get_size(bool z);                           //输出矩阵大小
T get_value(int x,int y);                       //获得元素值
CRectangle<T> get_line(int x);                  //获得行向量
CRectangle<T> get_row(int y);                   //获得列向量
T get_line_average(int x);                      //获得行向量的平均值
T get_row_average(int y);                       //获得列向量的平均值
T E_average();                                  //获得矩阵平均值
T get_model();                                  //获得向量的模
void swap_point(int x1,int y1,int x2,int y2);   //交换行、列、元素
void swap_line(int x1,int x2);                  //增加或减少行列
void swap_row(int y1,int y2);
void add_line();
void cut_line(int x);
void add_row();
void cut_row(int y);
void make_I();                                  //构造单位矩阵

/*定义加减乘,除法可用左乘矩阵的逆来,但是非方阵得另写*/
CRectangle<T> operator+(const CRectangle& other);
CRectangle<T> operator+(T value);
CRectangle<T> operator+=(const CRectangle& other);
CRectangle<T> operator+=(T value);

CRectangle<T> operator-(const CRectangle& other);
CRectangle<T> operator-(T value);
CRectangle<T> operator-=(const CRectangle& other);
CRectangle<T> operator-=(T value);

CRectangle<T> operator*(const CRectangle &other);
CRectangle<T> operator*(T value);

/*求余子式*/
CRectangle<T> remainder(int x,int y);
/*求转置*/
CRectangle<T> Trans();
/*求值*/
double D(CRectangle other);
/*求伴随*/
CRectangle<T> accompany();
/*求逆*/
CRectangle<T> converse();
/*求协方差*/
CRectangle<T> covariance_matrix();
/*求Doolittle分解*/
CRectangle<T> Doolittle();
/*求乔列斯分解*/
CRectangle<T> Cholesky();
/*求Jacobi迭代法求解向量*/
CRectangle<T> Jacobi(CRectangle S_V,CRectangle rec_answer,T limits);
/*求Guass-Sediel迭代法求解向量*/
CRectangle<T> Guass_Sediel(CRectangle S_V,CRectangle rec_answer,T limits);
/*Schmidt正交化法QR分解*/
void Schmidt_QR(CRectangle<T> &Q,CRectangle<T> &R);
/*利用QR分解计算所有特征值,times为迭代次数,建议为15次*/
CRectangle<T> Eig_all(int times);
/*计算矩阵的特征向量,默认误差值为0.001 */
CRectangle<T> get_eigenvector();

private:
/*计算正交化时的东西,默认为行向量*/
T orthogonalization_part(CRectangle <T> other);             //计算两个向量的正交系数
CRectangle<T> orthogonalization(CRectangle<T> others,
CRectangle<T> &rec_factor); //计算正交化时的参数,
//返回正交矩阵,
//rec_factor保存参数

std::vector< std::vector<T> >m_line_row;
std::vector< T >m_line;
int m_x;
int m_y;
};

我们导出的是:template class __declspec(dllexport) CRectangle<double>;

此版本的下载地址为:点击打开链接

若想看源码的请私下联系或留言,谢谢!
4000
在后续文章中我们来慢慢看这个矩阵类的实现,若发现bug请大家多批评指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐