資料結構之陣列和矩陣--矩陣&不規則二維陣列

元解~殤懷發表於2020-10-02

資料結構之陣列和矩陣--矩陣&不規則二維陣列

不規則二維陣列

不規則二維陣列的建立和使用

#include<iostream>
using namespace std;
int main()
{
	int numberOfRows = 5;
	int length[5] = {6,3,4,2,7};
	int **irregularArray = new int *[numberOfRows];
	for(int i = 0;i<numberOfRows; i++)
	{
		irregularArray[i] = new int [length[i]];
	}
	irregularArray[2][3] = 5;
	irregularArray[4][6] = irregularArray[2][3]+2;
	irregularArray[1][1] = 3;
	
	cout<<irregularArray[2][3]<<endl;
	cout<<irregularArray[4][6]<<endl;
	cout<<irregularArray[1][1]<<endl; 
 } 

矩陣

定義和操作

一個m*n的矩陣是一個m行,n列的表,m和n是矩陣的維數。
常見的矩陣操作:
矩陣的轉置;
矩陣的加法;
矩陣的乘法;

類matrix

下面展示一些 內聯程式碼片

template<class T>
class Matrix
{
friend ostream& operator<<(ostream& ,const Matrix<T>& );
public:
	Matrix(int theRows = 0,int theColumns = 0); //空建構函式
	Matrix(const Matrix<T>& );//複製構造器
	~Matrix(){delete [] element;}//析構器
	int Rows() const{return theRows;}//返回行
	int columns() const{return theColumns;}//返回列
	T& operator()(int i,int j) const;//過載“()”運算子
	Matrix<T>& operator=(const Matrix<T>&);//過載=運算子
	Matrix<T> operator+() const;//過載+運算子
	Matrix<T> operator+(const Matrix<T>&) const;//過載+運算子
	Matrix<T> operator-() const;//過載-運算子
	Matrix<T> operator-(const Matrix<T>& ) const;//過載-運算子
	Matrix<T> operator*(const Matrix<T>& ) const;//過載*運算子
	Matrix<T>& operator+=(const T& );//過載+=運算子
private:
	int theRows;
	int theColumns;
	T* element; 
	
};

操作

下面展示一些 內聯程式碼片

template <class T>
Matrix<T>::Matrix(int theRows,int theColumns)
{
	if(theRows < 0|| theColumns <0) cerr<<"Rows and columns must be >=0"<<endl;
	
	if(theRows == 0|| theColumns == 0) cerr<<"Either both or rows and columns should be zero"<<endl;
	this->theRows = theRows;
	this->theColumns = theColumns;
	element = new T [theRows*theColumns];
	
}
template<class T>
Matrix<T>::Matrix(const Matrix<T>& m)
{
	theRows = m.theRows;
	theColumns = m.theColumns;
	element = new T[theRows*theColumns];
	copy(m.element,m.element+theRows*theColumns,element);
	return *this;
 } 
tempalte <class T>
T& Matrix<T>::operator()(int ,int j) const
{
	if (i < 1||i>theRows||
		j<1||j>theColumns )
		cerr<<"wrong wrong wrong"<<endl;
	return element[(i-1)*theColumns+j-1];
}
Matrix<T> Matrix<T>::operator(const Matrix<T>& m) const
{
	Matrix<T> w (theRows,theColumns);
	for(int i=0; i<theRows*theColumns;i++)
	{
		w.element[i] = element[i]+m.element[i];
	}
	return w;
}
tempalte<class T>
Matrix<T> Matrix<T>::operator*(const Matrix<T>& m)
{
	Matrix<T> w(theRows,m.theColumns);
	int ct = 0,cm = 0,cw = 0;
	for(int i = 1;i<theRows;i++)
	{
		for(int j = 1;j<=m.theColumns;j++)
		{
			T sum = element[ct]*m.element[cm];
			for(int k = 2;k<=theColumns;k++)
			{
				ct++;
				cm += m.theColumns;
				sum += element[ct]*m.element[cm];
			}
			w.element[cw++] = sum;
			ct -= theColumns -1;
			cm = j;
		}
		ct+=theColumns;
		cm = 0; 
	}
	return w;
 } 

解析:
上面的程式碼中,有幾點要說一下:
第一:在()運算子過載的時候,小括號中有兩個值,int i和int j,這代表著該元素再陣列中的位置處在第幾行,第幾列。經過函式後,返回的是一個element[i]的形式。這是因為element我們定義的時候就是把element定義成一個一維陣列,也就是說,我們把二維陣列所佔據的二維空間拉成直線的一維空間進行儲存。所以每一個二維陣列中的元素再一維陣列中都有一個對應的位置。(即一個對映函式)

第二,在過載矩陣乘法運算子的時候,我們採用三迴圈的辦法,這種辦法消耗的時間複雜度很大。其中cm += m.theColumns;這句程式碼所表現的和上面的一條的思想是一樣的,也是二維陣列轉化成三維陣列的一個過程。

相關文章