找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

C++下的自定义矩阵保存类

admin 2019-4-12 05:48 78人围观 C++相关

最近在自学C++的过程中试图编写一个有关矩阵运算的类。但是在转置矩阵这里不知道是大脑的缘故还是什么原因,总之卡了不少时间。

介绍自定义的类matrixSave。

类的私有成员分别是:

int m, n;

int *p = nullptr;

m和n分别储存矩阵的行数和列数,*p是操作矩阵元素的指针,这里已经初始化。

类的公共成员我暂时设定为以下:

matrixSave();
matrixSave(int, int);matrixSave(int, int, int*);matrixSave(matrixSave & m1);~matrixSave();void input();void output();void operator=(const matrixSave & m1);const matrixSave operator+(const matrixSave & m1);const matrixSave operator-(const matrixSave & m1);const matrixSave operator*(const matrixSave & m1);
void transposition(const matrixSave & m1);

有4个构造函数。第1个是没有初始化条件时执行的构造函数,它会把m,n赋值为0;第2个是初始化条件为m,n的构造函数,同时这个函数会执行p = new int[m*n]();创建动态内存空间来保存矩阵元素。第3个初始化条件为m,n和某个数组,设立这个函数的初衷是调试时反复输入矩阵元素到厌烦,遂补充……;第4个是赋值构造函数,用于处理重载时引发的野指针问题。

有1个析构函数。析构函数内有delete [] p;因为保存矩阵元素的空间来源于new,所以需要一个在程序执行完毕后的释放手段。

input();手动输入矩阵。

output();矩阵输出至屏幕。

有4个运算符重载函数,分别重载了“=,+,-,*”;

operator*比较恶心,源代码奉上(PS:应该有更好的算法吧,我这个都三重循环了……)。注意return,return在执行时会复制一份副本,这导致同一个动态内存空间有两个指针指向其,而析构函数只会释放一个。所以这也是要设立复制构造函数的原因——再开辟一个内存空间,保证一对一。

const matrixSave matrixSave::operator*(const matrixSave & m1)
{ matrixSave product(this->m, m1.n); if(this->n == m1.m) { for(int i = 0; i < this->m; i++) for(int j = 0; j < m1.n; j++) for(int k = 0; k < m1.m; k++) *(product.p + i*product.n + j) += (*(p + i*n + k)) * (*(m1.p + k * m1.n + j)); } else cout << "The program can not multiply ! "; return product;}

最后设定了transposition(const matrixSave & m1);用于转置矩阵。这个最恶心……

void matrixSave::transposition(const matrixSave & m1)
{ if(m == 0 && n == 0) { m = m1.n; n = m1.m; p = new int[m * n](); } if(m == m1.n && n == m1.m) for(int i = 0; i < m1.m; i++) for(int j = 0; j < m1.n; j++) *(p + j * m1.m + i) = *(m1.p + i * m1.n + j); else cout << "transposition is failed!" << endl;}

计划以后补充文件输入输出函数,excel输入输出,等等……不过也可能通过继承的方式新开一个类了。

下一步计划编写线性变换类。(垃圾没人看吧,自嗨ing,哈哈哈哈……)


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:希弗的工作室,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......


关于进行手机实名认证的紧急通知!
按照有关部门要求,论坛类网站必须完成手机实名认证才可以进行发帖等操作。希望大家积极配合,为创建一个和谐文明的社区而贡献自己的力量。我们会对会员的隐私进行严格保密,对大家造成的不便深表歉意! 我知道了