对角矩阵(diagonal):M是一个对角矩阵,则当且仅当i≠j时,M(i,j)=0。
一个rows×rows的对角矩阵D能够表示为 一个二维数组element[rows][rows],其中element[i-1][j-1]表示D(i,j)。
这种表示法须要rows²个数据类型为T的数据空间。
对角矩阵最多含有rows个非0元素,所以能够用一维数组element[rows]来表示对角矩阵,其中element[i-1]表示D(i,i)
全部未在一维数组中出现的矩阵元素均为0.这种表示法仅仅须要rows个类型为T的数据空间。
diagonalMatrix.cppios
/* * 对角矩阵测试函数的主函数 * diagonalMatrix.cpp */ #include<iostream> #include"diagonalmatrix.h" using namespace std; int main(void) { diagonalMatrix<int> x(20); x.set(1,1,22); x.set(5,5,44); x.set(8,5,0); cout<<x.get(5,5) <<endl; cout<<x.get(1,1) <<endl; cout<<x.get(10,1) <<endl; return 0; }
diagonalMatrix.h数组
/* * 对角矩阵 * diagonalMatrix.h */ #ifndef DIAGONALMATRIX_H #define DIAGONALMATRIX_H #include"myexceptions.h" template<class T> class diagonalMatrix { public: diagonalMatrix(int theN = 10); ~diagonalMatrix(){delete [] element;} T get(int,int) const; void set(int,int,const T&); private: int n; T* element; }; //构造函数的具体实现 template<class T> diagonalMatrix<T>::diagonalMatrix(int theN) { if(theN < 1) throw illegalParameterValue("Matrix size must be > 0"); n = theN; element = new T [n]; } //get()函数的具体实现 template<class T> T diagonalMatrix<T>::get(int i, int j) const { if(i < 1 || j < 1 || i > n || j > n) throw matrixIndexOutOfBounds(); if(i == j) return element[i - 1]; else return 0; } //set()函数的具体实现 template<class T> void diagonalMatrix<T>::set(int i, int j, const T& newValue) { 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"); } #endif // DIAGONALMATRIX_H
myExceptions.h函数
/* *异常类 *myExceptions.h */ #ifndef MYEXCEPTIONS_H #define MYEXCEPTIONS_H #include<string> using namespace std; //不合法的参数值 class illegalParameterValue { public: illegalParameterValue(string theMessage = "Illegal parameter value") { message = theMessage; } void outputMessage() { cout <<message<<endl; } private: string message; }; //数组索引不合法 class matrixIndexOutOfBounds { public: matrixIndexOutOfBounds(string theMessage = "Matrix index out of bounds") { message = theMessage; } void outputMessage() { cout << message <<endl; } private: string message; }; //数组大小不匹配 class matrixSizeMismatch { public: matrixSizeMismatch(string theMessage = "The size of the two matrics doesn't match") { message = theMessage; } void outputMessage() { cout << message <<endl; } private: string message; }; #endif // MYEXCEPTIONS_H