C++實現對角矩陣(一維數組實現)


原理

當且僅當i不等於j時,M(i,j)=0為對角矩陣

一個rows X rows的對角矩陣D可以表示為一個二維數組element[rows][rows],其中element[i-1][j-1]表示D(i,j)。
這種表示法需要rows*rows個類型為T的數據空間。然而,對角矩陣對多只有rows個非0元素,因此可以用一維數組element[rows]來表示對角矩陣,其中elemennt[i-1]表示D(i,j).
所有未在一維數組中出現的矩陣元素均為0。這種表示法僅需要rows個類型為T的數據空間。

diagonalMatrix實現可對角矩陣轉置輸出加減乘除等操作。異常處理為自定義異常類型。不影響觀看。可自己定義自己的異常類型。

此為《數據結構、算法與應用C++描述》書籍內容習題解答匯總

diagonalMatrix.h

#include <iostream>
#include "myExceptions.h"

template<class T>
class diagonalMatrix
{
	friend std::ostream& operator<<
		(ostream& out, const diagonalMatrix<T>& dm);
public:
	diagonalMatrix(int theN = 10);
	diagonalMatrix(const diagonalMatrix<T>& dm);
	~diagonalMatrix() { delete[] element; }
	T get(int i, int j) const;
	void set(int i, int j, const T& newValue);

	diagonalMatrix<T> tranpose();//轉置矩陣
	diagonalMatrix<T>& operator=(const diagonalMatrix<T>& dm);

	diagonalMatrix<T> operator+(const diagonalMatrix<T>& dm) const;//二元正號
	diagonalMatrix<T> operator-() const;//一元負號
	diagonalMatrix<T> operator-(const diagonalMatrix<T>& dm) const;//二元負號
	diagonalMatrix<T> operator*(const diagonalMatrix<T>& dm) const;

	diagonalMatrix<T>& operator+=(const T& x);
	diagonalMatrix<T>& operator-=(const T& x);
	diagonalMatrix<T>& operator/=(const T& x);
	diagonalMatrix<T>& operator*=(const T& x);
private:
	int n; //矩陣維數
	T* element;//存儲對角矩陣的一維數組
};

template<class T>
diagonalMatrix<T>::diagonalMatrix(int theN)
{//構造函數
	//檢驗theN值是否有效
	if (theN < 1)
		throw illegalParameterValue("Matrix size must be > 0");
	n = theN;
	element = new T[n];
}

template<class T>
diagonalMatrix<T>::diagonalMatrix(const diagonalMatrix<T>& dm)
{//賦值構造
	n = dm.n;
	element = new T[n];
	std::copy(dm.element, dm.element + n, element);
}

template<class T>
T diagonalMatrix<T>::get(int i, int j) const
{//返回矩陣中(i,j)位置上的元素
	if (i<1 || j<1 || i>n || j>n)
		throw matrixIndexOutOfBounds();

	return (i == j) ? element[i - 1] : 0;
}

template<class T>
void diagonalMatrix<T>::set(int i, int j, const T& newValue)
{//存儲(i,j)項的新值
	if (i<1 || j<1 || i>n || j>n)
		throw matrixIndexOutOfBounds();

	if (i == j)
		element[i - 1] = newValue;
	else
		if (newValue != 0)
			throw illegalParameterValue("nondiagonal elements must be zero");
}

template<class T>
diagonalMatrix<T> diagonalMatrix<T>::tranpose()
{//轉置矩陣,具體是修改本身矩陣還是返回值傳遞。。。
//看需求吧.例如可以是 void trandpose(diagonalMatrix<T>& dm)
	diagonalMatrix<T> w(n);
	for (int i = 0; i < n; ++i)
		w.element[i] = element[i];
	return w;
}

template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator=(const diagonalMatrix<T>& dm)
{//=號
	if(this !=&dm)
	{//是否=於了自己
		delete[] element;
		n = dm.n;
		element = new T[n];
		std::copy(dm.element, dm.element + n, element);
	}
	return *this;
}

template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator+(const diagonalMatrix<T>& dm) const
{//二元加號
	if (n != dm.n)
		throw matrixSizeMismatch();
	diagonalMatrix<T> w(n);
	for (int i = 0; i < n; ++i)
		w.element[i] = element[i] + dm.element[i];
	return w;
}

template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator-() const
{//一元負號
	diagonalMatrix<T> w(n);
	for (int i = 0; i < n; ++i)
		w.element[i] = -element[i];
	return w;
}

template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator-(const diagonalMatrix<T>& dm) const
{//二元負號
	if (n != dm.n)
		throw matrixSizeMismatch();
	diagonalMatrix<T> w(n);
	for (int i = 0; i < n; ++i)
		w.element[i] = element[i] - dm.element[i];
	return w;
}

template<class T>
diagonalMatrix<T> diagonalMatrix<T>::operator*(const diagonalMatrix<T>& dm) const
{//乘法
	if (n != dm.n)
		throw matrixSizeMismatch();
	diagonalMatrix<T> w(n);
	for (int i = 0; i < n; ++i)
		w.element[i] = element[i] * dm.element[i];
	return w;
}

template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator+=(const T& x)
{//+=
	for (int i = 0; i < n; ++i)
		element[i] += x;
	return *this;
}

template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator-=(const T& x)
{//-=
	for (int i = 0; i < n; ++i)
		element[i] -= x;
	return *this;
}

template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator/=(const T& x)
{// /=
	for (int i = 0; i < n; ++i)
		element[i] /= x;
	return *this;
}

template<class T>
diagonalMatrix<T>& diagonalMatrix<T>::operator*=(const T& x)
{//*=
	for (int i = 0; i < n; ++i)
		element[i] *= x;
	return *this;
}

template<class T>
std::ostream& operator<<
	(ostream& out, const diagonalMatrix<T>& dm)
{//輸出
	for (int i = 0; i < dm.n; i++)
	{
		for (int j = 0; j < dm.n; j++)
			if (i == j)
				out << dm.element[i] << " ";
			else
				out << 0 << " ";
		out << endl;
	}
	return out;
}

std::ostream& operator<<
	(ostream& out, const diagonalMatrix<int>& dm)
{//出於某些原因,編譯器不能自己創建這個。書上這么介紹的。不書寫的話會出現一個鏈接錯誤。暫時沒有找到原因
	for (int i = 0; i < dm.n; i++)
	{
		for (int j = 0; j < dm.n; j++)
			if (i == j)
				out << dm.element[i] << " ";
			else
				out << 0 << " ";
		out << endl;
	}
	return out;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM