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>;
上述东西看似不长,但是很难找,现在我们言归正传,下面来看矩阵类的定义:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87template<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>;
此版本的下载地址为:
点击打开链接
若想看源码的请私下联系或留言,谢谢!在后续文章中我们来慢慢看这个矩阵类的实现,若发现bug请大家多批评指教。
最后
以上就是干净小蝴蝶最近收集整理的关于C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab的全部内容,更多相关C++实现矩阵类内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复