矩阵类的实现

一、实现矩阵类及以下功能

(1)编写一个 row*col 的矩阵类,定义构造函数、复制构造函数;

(2)重载运算符“+”和“-”实现矩阵的相应运算;

(3)重载运算符<<实现矩阵数据的输出。


二、代码

(1)头文件 matrix.h

#include<iostream>
using namespace std;

class Matrix{
private:
	int row;
	int col;
	int size;
	double* data;

public:
	Matrix(int r,int c){
		row = r;
		col = c;
		size = row * col;
		data = new double[size];
		cout<<"请输入"<<row<<"*"<<col<<"矩阵:"<<endl;
		for(int i=0; i<row; i++){
			for(int j=0; j<col; j++){
				cin >> data[i*row+j];
			}
		}
	}

	~Matrix(void){
		delete []data;
	}
	Matrix (const Matrix& M)
	{
		col = M.col;
		row = M.row;
		size = M.size;
		data = new double [M.size];
		for(int i=0; i<row; i++){
			for(int j=0; j<col; j++){
				data[i*row+j] = M.data[i*row+j];
			}
		}

	}
	Matrix& operator=(Matrix& M)
	{
		if (this == &M)
		{
			return *this;
		}
		col = M.col;
		row = M.row;
		size = M.size;
		data = new double [M.size];
		for(int i=0; i<row; i++){
			for(int j=0; j<col; j++){
				data[i*row+j] = M.data[i*row+j];
			}
		}
		return *this;
	}
	Matrix operator+(Matrix& M){
		Matrix M1 = *this;
		if(col == M.col && row == M.row){
			for(int i=0; i<M1.row; i++){
				for(int j=0; j<M1.col; j++){
					M1.data[i*row+j] = data[i*row+j] + M.data[i*row+j];
				}
			}
			return M1;
		}
		else{
			cout << "矩阵行或列数不相等,不能相加" << endl;
			return M1;
		}
	}
	Matrix operator-(Matrix& M){
		Matrix M1 = *this;
		if(col == M.col && row == M.row){
			for(int i=0; i<M1.row; i++){
				for(int j=0; j<M1.col; j++){
					M1.data[i*row+j] = data[i*row+j] - M.data[i*row+j];
				}
			}
			return M1;
		}
		else{
			cout << "矩阵行或列数不相等,不能相减" << endl;
			return M1;
		}
	}
	friend ostream& operator<<(ostream& out,Matrix& M){
		for(int i=0; i<M.row; i++){
			for(int j=0; j<M.col; j++){
				out << M.data[i*M.row+j] << ' ';
			}
			out << endl;
		}
		return out;
	}
};

(2)源文件 main.cpp

#include<iostream>
#include "matrix.h"
using namespace std;

int main(void){
	Matrix M1(4,4);
	Matrix M2(4,4);
	Matrix M3 = M1;
	Matrix M4 = M1 + M2;
	Matrix M5 = M3 - M2;
	cout << "M1:"<<endl << M1 << endl;
	cout << "M2:"<<endl << M2 << endl;
	cout << "M3 = M1:"<<endl << M3 << endl;
	cout << "M4 = M1 + M2:"<<endl << M4 << endl;
	cout << "M5 = M3 - M2:"<<endl << M5 << endl;
	return 0;
}

三、引入类模板的改进

template <class T>
class Matrix{
private:
	int row;
	int col;
	int size;
	T* data;

public:
	Matrix(int r,int c){
		row = r;
		col = c;
		size = row * col;
		data = new T[size];
		cout<<"请输入"<<row<<"*"<<col<<"矩阵:"<<endl;
		for(int i=0; i<row; i++){
			for(int j=0; j<col; j++){
				cin >> data[i*row+j];
			}
		}
	}

顺便说下模板的实例化如下

 Matrix<float> M(4,4);
好的,下面是一个简单的 C++ 矩阵实现矩阵相乘的示例代码: ```c++ #include <iostream> #include <vector> using namespace std; class Matrix { private: vector<vector<int>> data; // 存储矩阵的二维向量 int m, n; // 矩阵的行数和列数 public: // 构造函数 Matrix(int rows, int cols) { m = rows; n = cols; data.resize(m, vector<int>(n, 0)); // 初始化矩阵为全零矩阵 } // 矩阵相乘运算符重载 Matrix operator*(const Matrix& other) { if (n != other.m) { cout << "矩阵维度不匹配,无法相乘" << endl; return Matrix(0, 0); } Matrix result(m, other.n); for (int i = 0; i < m; i++) { for (int j = 0; j < other.n; j++) { int temp = 0; for (int k = 0; k < n; k++) { temp += data[i][k] * other.data[k][j]; } result.data[i][j] = temp; } } return result; } // 矩阵赋值运算符重载 Matrix& operator=(const Matrix& other) { if (this == &other) { return *this; } m = other.m; n = other.n; data = other.data; return *this; } // 打印矩阵 void print() { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << data[i][j] << " "; } cout << endl; } } }; int main() { Matrix A(2, 3); Matrix B(3, 2); A.print(); B.print(); A = {{1, 2, 3}, {4, 5, 6}}; B = {{7, 8}, {9, 10}, {11, 12}}; A.print(); B.print(); Matrix C = A * B; C.print(); return 0; } ``` 这个示例代码中,我们定义了一个 `Matrix` 来表示矩阵,并实现矩阵相乘的运算符重载。在 `main()` 函数中,我们创建了两个矩阵 `A` 和 `B`,并将它们赋值为我们需要相乘的矩阵。然后,我们通过 `A * B` 的方式来计算它们的乘积,并将结果存储在 `C` 中。最后,我们打印了 `C` 的值,即矩阵相乘的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值