概述
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>;
此版本的下载地址为:
点击打开链接
若想看源码的请私下联系或留言,谢谢!在后续文章中我们来慢慢看这个矩阵类的实现,若发现bug请大家多批评指教。
最后
以上就是干净小蝴蝶为你收集整理的C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab的全部内容,希望文章能够帮你解决C++实现矩阵类,实现了大部分矩阵运算功能,大家可以类比matlab所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复