通过类实现矩阵加减法、乘法、转置(C++))

这篇具有很好参考价值的文章主要介绍了通过类实现矩阵加减法、乘法、转置(C++))。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定义一个二维方阵类 matrix
通过重载二元运算符“+”、“-”、“*”和一元运算符“~”, 来实现矩阵加、矩阵减、矩阵乘以及矩阵转置。

matrix类的构造、拷贝构造及析构

1.由于矩阵的行与列都是未知的,首先需要通过动态分配内存实现创建任意大小的矩阵,由于类中默认的构造函数无法满足我们的需求,因此首先应该改写构造函数

matrix(int a, int b) {
		r = a;
		c = b;
		mem = new int* [a];
		for (int i = 0; i < a; i++) {
			mem[i] = new int[b];
		}
	};

2.类中构造函数出现动态分配内存,就要考虑深拷贝与浅拷贝的问题,由于下文实现矩阵运算功能的函数中某些函数在传参时需要拷贝,因此必须通过深拷贝进行,否则会引发一系列问题,应该改写拷贝构造函数

matrix(const matrix& p) {
		r = p.r;
		c = p.c;
		mem = new int* [r];
		for (int i = 0; i < r; i++) {
			mem[i] = new int[c];
		}
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++) {
				mem[i][j] = p.mem[i][j];
			}
	}

3.同样的,析构函数应释放动态分配的内存,这里也需要改写

	~matrix() {
		for (int i = 0; i < r; i++) {
			delete[]mem[i];
		}
		delete[]mem;
	};

matrix的运算符重载

1.矩阵加法(减法)
首先应判断两个矩阵的行宽和列宽是否一致,满足一致后开始加法运算
其次,传参时用const matrix& m是为了防止引用造成原内容被修改(引用传参前能加const尽量加)
注意,这里便体现了改写拷贝构造函数的用处,return tmp;发生了一次拷贝构造,如果没有改写,会引发浅拷贝的问题。

matrix operator+ (const matrix& m) {
        //应判断两个矩阵的行宽和列宽是否一致
		if (r != m.r || c != m.c) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			matrix tmp(r, c);
			for (int i = 0; i < r; i++)
				for (int j = 0; j < c; j++)
					tmp.mem[i][j] = mem[i][j] + m.mem[i][j];
			return tmp;
		}
	}

易错点:如下代码看似没有采用拷贝构造,但是违背了加法运算的本质(*this的值被修改)

matrix operator+ (matrix& m)//矩阵加
	{
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++)
				mem[i][j] = mem[i][j] + m.mem[i][j];
		return *this;
	}

减法原理与加法类似,不做赘述
2.矩阵乘法

matrix operator* (const matrix& m)//矩阵乘
	{
		if (c != m.r) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			matrix tmp(r, m.c);
			for (int i = 0; i < r; i++)
				for (int j = 0; j < m.c; j++)
					tmp.mem[i][j] = 0;
			for (int i = 0; i < tmp.r; i++)
				for (int j = 0; j < tmp.c; j++)
					for (int k = 0; k < c; k++)
						tmp.mem[i][j] += (mem[i][k] * m.mem[k][j]);
			return tmp;
		}
	}

3.矩阵转置

matrix operator~ ()//矩阵转置
	{
		matrix tmp(c, r);
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++)
				tmp.mem[j][i] = mem[i][j];
		return tmp;
	}

4.=运算符重载
易错点matrix operator=(const matrix& m)如果返回值不是引用,当进行(a=b)=c时,a=b返回的不是a本身,而是一个临时变量,那么(a=b)=c相当于c的值最后没有赋值给a

matrix & operator=(const matrix& m)
	{
		if (c != m.r) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			for (int i = 0; i < r; i++)
				for (int j = 0; j < c; j++)
					mem[i][j] = m.mem[i][j];
			return *this;
		}
	}

5.输出函数(用于打印结果)

friend void display(matrix m)//输出矩阵
	{
		for (int i = 0; i < m.r; i++) {
			for (int j = 0; j < m.c; j++) {
				cout << m.mem[i][j] << ' ';
			}
			cout << endl;
		}
		cout << "====================================================================================" << endl;
	}

完整代码实现:

#include <iostream>
using namespace std;
class matrix {
public:
	int r, c;
	int** mem;
	matrix(int a, int b) {
		r = a;
		c = b;
		mem = new int* [a];
		for (int i = 0; i < a; i++) {
			mem[i] = new int[b];
		}
	};
	matrix(const matrix& p) {
		r = p.r;
		c = p.c;
		mem = new int* [r];
		for (int i = 0; i < r; i++) {
			mem[i] = new int[c];
		}
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++) {
				mem[i][j] = p.mem[i][j];
			}
	}
	~matrix() {
		for (int i = 0; i < r; i++) {
			delete[]mem[i];
		}
		delete[]mem;
	};
	matrix operator+ (const matrix& m) {
		if (r != m.r || c != m.c) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			matrix tmp(r, c);
			for (int i = 0; i < r; i++)
				for (int j = 0; j < c; j++)
					tmp.mem[i][j] = mem[i][j] + m.mem[i][j];
			return tmp;
		}
	}
	matrix operator- (const matrix& m) {
		if (r != m.r || c != m.c) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			matrix tmp(r, c);
			for (int i = 0; i < r; i++)
				for (int j = 0; j < c; j++)
					tmp.mem[i][j] = mem[i][j] - m.mem[i][j];
			return tmp;
		}
	}
	matrix operator* (const matrix& m)//矩阵乘
	{
		if (c != m.r) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			matrix tmp(r, m.c);
			for (int i = 0; i < r; i++)
				for (int j = 0; j < m.c; j++)
					tmp.mem[i][j] = 0;
			for (int i = 0; i < tmp.r; i++)
				for (int j = 0; j < tmp.c; j++)
					for (int k = 0; k < c; k++)
						tmp.mem[i][j] += (mem[i][k] * m.mem[k][j]);
			return tmp;
		}
	}
	matrix operator~ ()//矩阵转置
	{
		matrix tmp(c, r);
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++)
				tmp.mem[j][i] = mem[i][j];
		return tmp;
	}
	matrix & operator=(const matrix& m)
	{
		if (c != m.r) {
			cout << "error";
			matrix tmp(r, c);
			tmp.mem = NULL;
			return tmp;
		}
		else {
			for (int i = 0; i < r; i++)
				for (int j = 0; j < c; j++)
					mem[i][j] = m.mem[i][j];
			return *this;
		}
	}
	friend void display(matrix m)//输出矩阵
	{
		for (int i = 0; i < m.r; i++) {
			for (int j = 0; j < m.c; j++) {
				cout << m.mem[i][j] << ' ';
			}
			cout << endl;
		}
		cout << "====================================================================================" << endl;
	}
};

主函数测试结果:文章来源地址https://www.toymoban.com/news/detail-462859.html

int main() {
	matrix p1(2, 3), p2(2, 3), p3(3, 2);
	int num1 = 0, num2 = 1, num3 = 2;
	for (int i = 0; i < p1.r; i++)
		for (int j = 0; j < p1.c; j++) {
			p1.mem[i][j] = num1;
			num1++;
		}
	for (int i = 0; i < p2.r; i++)
		for (int j = 0; j < p2.c; j++) {
			p2.mem[i][j] = num2;
			num2++;
		}
	for (int i = 0; i < p3.r; i++)
		for (int j = 0; j < p3.c; j++) {
			p3.mem[i][j] = num3;
			num3++;
		}
	matrix p11 = p1 + p2;
	cout << "p1" << endl;
	display(p1);
	cout << "p2" << endl;
	display(p2);
	cout << "p3" << endl;
	display(p3);
	cout << "p11" << endl;
	display(p11);
	cout << "p1+p2" << endl;
	display(p1 + p2);
	system("pause");
}

到了这里,关于通过类实现矩阵加减法、乘法、转置(C++))的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小学20以内加减法_自动生成器

    2024年02月12日
    浏览(31)
  • 线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)

    目录 加减 数乘  矩阵与矩阵相乘  矩阵的幂 矩阵转置  方阵的行列式  方阵的行列式,证明:|AB| = |A| |B|        

    2024年01月22日
    浏览(32)
  • Logisim利用先行进位加减法器设计2位数(即100以内)的BCD码的可控加/减法器

    文末附电路的资源链接 BCD码的加法:相加结果若大于9(1001),则加6校正。 BCD码的减法(补码算法): ①求减数的补码,如果是两位,则:补码 = 100 - 减数。这里的100,用2位的BCD码可以表示为9AH(1001 1010)。注:用9AH不用A0H的原因是9A作为被减数直接省去向十位借位的步骤

    2023年04月16日
    浏览(59)
  • 计算机组成原理--基于Logisim的8位可控加减法器实验的应用(超详细/设计/实验/作业/练习)

    掌握一位全加器的实现逻辑,掌握多位可控加减法电路的实现逻辑,熟悉 Logisim 平台基本功能,能在 logisim 中实现多位可控加减法电路。 1.软件:Logisim软件、JAVA环境 2.硬件:计算机Windows 10 在 Logisim 模拟器中打开 alu.circ 文件,在对应子电路中利用已经封装好的全加器设计8

    2024年02月04日
    浏览(105)
  • C++数据结构稀疏矩阵运算(含加减乘及快速转置)

    题目: 内容:稀疏矩阵运算器 要求:使用三元组顺序表存储矩阵;实现矩阵的逆置、加、减、乘运算;具有相应的报错处理。 本人采用C++来书写该数据结构的题目,有兴趣的同学可以了解一下需要掌握一定的封装的能力。 类的结果存储如下所示: 加减法的函数内容如下所

    2023年04月10日
    浏览(25)
  • R语言矩阵、向量操作(矩阵乘法,向量内积、外积(叉乘),矩阵转置,矩阵的逆)

    创建两个四维矩阵 A 与 B,A 按列填充,B 按行填充 : 创建两个 n 维向量 x 和 y : 使用 t(矩阵、向量名) 即可: 输出如下: 使用 %*% 符号即可: 输出如下: 在R语言中,两个矩阵、向量的内积并不只是简单的 * 号就完事了,而是有以下两种求法: 或者 其结果如下: (注意区分

    2024年02月12日
    浏览(21)
  • 【矩阵乘法】C++实现外部矩阵乘法

    ​ 使用文件和内存模拟系统缓存,并利用矩阵乘法验证实际和理论情况。 设计一个 Matrix 类,其中 Matrix 是存在磁盘中的一个二进制文件,类通过保存的矩阵属性来读取磁盘。前八个字节为两个 int32 ,保存矩阵的行列数。 Matrix中有一个 buffer 成员为读取到的数据缓存,通过

    2024年02月11日
    浏览(24)
  • 三元组(C++ 实现矩阵快速转置)

      三元组稀疏矩阵是一种高效存储稀疏矩阵的方法。它通过记录矩阵中非零元素的行、列和值来表示一个稀疏矩阵。我们在三元组里存储的是每个元素的行、列以及值。 题目:   任意输入一个稀疏矩阵M,用三元组顺序表压缩存储该稀疏矩阵M,然后求其转置矩阵T,并输出转

    2024年02月08日
    浏览(29)
  • 【数据结构】数组和字符串(十):稀疏矩阵的链接存储:十字链表的矩阵操作(加法、乘法、转置)

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月08日
    浏览(41)
  • C++利用类实现矩阵的数乘、乘法以及点乘

        ----------------------------------矩阵的数乘、乘法、点乘---------------------------------------*    *-description:用户选择运算方式后输入矩阵的规模并赋值,随即进行矩阵相关运算      *- author:Luo                                                                             

    2024年02月06日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包