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 __declspec(dllexport) CRectangle<double>;
此版本的下载地址为:点击打开链接
若想看源码的请私下联系或留言,谢谢!
4000
在后续文章中我们来慢慢看这个矩阵类的实现,若发现bug请大家多批评指教。
由于本课题不含源码(会于后期发布),发布的是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请大家多批评指教。
相关文章推荐
- C++矩阵运算实现
- C++实现矩阵运算
- c++第八周【任务3】实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
- 矩阵乘法 模板函数的实现 可以处理多维矩阵 c++
- 矩阵论基础 2.5 用Matlab实现矩阵的基本运算
- C/C++语言实现矩阵求逆运算—高斯约化/消元法
- c++中进行矩阵运算如何才能比matlab快?
- 位运算可以实现哪些功能
- C语言数据结构之单向链表(已经调试可以实现相应的功能了,可是还是有几个问题现在还是不大理解,希望大家能够一起探讨)
- C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗(从面向对象的三大属性进行分析)
- 2.matlab实现矩阵的基本运算
- C++初学初练类与对象之矩阵简单功能实现
- 《C++第八周实验报告3-1》---实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算
- android实现的计算器功能,可以加减乘除;可以倒退,可以清空文本,大家参考使用吧
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
- 矩阵乘法 模板函数的实现 可以处理多维矩阵 c++ - utopiaT
- 问题五十二:怎么用C++实现矩阵运算
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
- 在C++中实现矩阵运算
- DCT变换及量化的c++实现(基于opencv矩阵运算)