資料結構實驗 二維矩陣的實現

球王武磊發表於2020-11-18

資料結構實驗 二維矩陣的實現

#include <iostream>
#include <cstdio>
#include <memory>//包含unique_ptr的標頭檔案 
using namespace std;

template <class T> 
class Matrix
{
	public:
		Matrix()=default;//預設建構函式 
		Matrix(int a1,int a2);//含行列數的建構函式 
		T operator()(int i,int j) const;//過載(),用來獲取元素的值 
		T& operator()(int i,int j);//過載(),用來修改元素的值 
		int getb1();//獲取行數b1 
		int getb2();//獲取列數b2 
		void print();//列印矩陣各元素 
		Matrix operator +(Matrix &B);//過載運算子+,矩陣相加 
		Matrix operator -(Matrix &B);//過載運算福-,矩陣相減 
		Matrix operator *(Matrix &B);//過載運算福*,矩陣相乘 
	private:
		int b1,b2;
		unique_ptr<T[]> pointer;
};

template <class T>
Matrix<T>::Matrix(int a1,int a2)//含行列數的建構函式 
{
	b1=a1;b2=a2;
	pointer=unique_ptr<T[]>(new int[b1*b2]);
}

template <class T>
T Matrix<T>::operator()(int i,int j) const//過載(),用來獲取元素的值 
{
	return pointer[i*b2+j];
}

template <class T>
T& Matrix<T>::operator()(int i,int j)//過載(),用來修改元素的值 
{
	return pointer[i*b2+j];
}

template <class T>
int Matrix<T>::getb1()//獲取行數b1 
{
	return b1;
}

template <class T>
int Matrix<T>::getb2()//獲取列數b2 
{
	return b2;
}

template <class T>
void Matrix<T>::print()//列印矩陣各元素 
{
	for(int i=0;i<b1;i++)
	{
		for(int j=0;j<b2;j++)
			printf("%d ",pointer[i*b2+j]);
		printf("\n");
	}
}

template <class T>
Matrix<T> Matrix<T>::operator +(Matrix &B)//過載運算子+,矩陣相加 
{
	if(b1!=B.getb1()||b1!=B.getb2())
		return Matrix();
	Matrix C(b1,b2);
	for(int i=0;i<b1;i++)
		for(int j=0;j<b2;j++)
			C(i,j)=pointer[i*b2+j]+B(i,j);
	return C;
}

template <class T>
Matrix<T> Matrix<T>::operator -(Matrix &B)//過載運算福-,矩陣相減 
{
	if(b1!=B.getb1()||b1!=B.getb2())
		return Matrix();
	Matrix C(b1,b2);
	for(int i=0;i<b1;i++)
		for(int j=0;j<b2;j++)
			C(i,j)=pointer[i*b2+j]-B(i,j);
	return C;
}

template <class T>
Matrix<T> Matrix<T>::operator *(Matrix &B)//過載運算福*,矩陣相乘 
{
	if(b2!=B.getb1())//第二個矩陣的行數等於第一個矩陣的列數時才可以相乘 
		return Matrix();
	Matrix C(b1,b2);
	for(int i=0;i<b1;i++)
		for(int j=0;j<b2;j++)
			C(i,j)=0;
	for(int i=0;i<b1;i++)
		for(int j=0;j<B.getb2();j++)
			for(int k=0;k<b2;k++)
				C(i,j)+=pointer[i*b2+k]*B(k,j);
	return C;
}


int main()
{
	//資料測試 
	Matrix<int> A(2,2);
	int k=0;
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
		A(i,j)=++k;
	printf("矩陣A各元素的值為:\n");
	A.print();
	Matrix<int> B(2,2);
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++)
		B(i,j)=2;
	printf("矩陣B各元素的值為:\n");
	B.print();
	Matrix<int> C=A+B;
	Matrix<int> D=A-B;
	Matrix<int> E=A*B;
	printf("矩陣C各元素的值為:\n");
	C.print();
	printf("矩陣D各元素的值為:\n");
	D.print();
	printf("矩陣E各元素的值為:\n");
	E.print();
	return 0;
}

相關文章