技術含量不多,主要是自己收藏,記載著這裡,以後用的時候再看看。
//File matrix.h#ifndef MATRIX_H#define MATRIX_H#include <iostream>#include <string>using namespace std;template<typename T>class Matrix{//private:public:int row,col; //行、列T *element; //數組public:Matrix(int r = 1,int c = 1); //建構函式Matrix(int r, int c, T* initval); //建構函式Matrix(const Matrix<T>&); //拷貝建構函式~Matrix(){delete element;} //解構函式int Rowsize()const{return row;} //行長int Colsize()const{return col;} //列長T& operator()(int i,int j)const; //取元素Matrix<T>&operator=(const Matrix<T>&); //賦值Matrix<T>operator+()const; //一元加Matrix<T>operator+(const Matrix<T>&); //二元加Matrix<T>operator-()const; //一元減Matrix<T>operator-(const Matrix<T>&)const; //二元減Matrix<T>operator*(const Matrix<T>&)const; //乘法Matrix<T>transpose(); //轉置friend ostream& operator<<(ostream& out, const Matrix<T>&);};//考慮到矩陣操作中可能出現異常,定義兩個異常類,分別表示下標越界和行、列不匹配的異常class Bounds_error //下標越界異常{public:Bounds_error(char* s):str(s){}void display(){cout<<str<<endl;}private:string str;};class RCdismatch //行列不匹配異常{public:RCdismatch(char* s):str(s){}void display(){cout<<str<<endl;}private:string str;};#endif
//File Matrix.cpp 是類Matrix的實現檔案#include <iomanip>#include "matrix.h"using namespace std;////////////////////////////////////////////////////////////////各成員函數的實現template<typename T>Matrix<T>::Matrix(int r, int c)//建構函式{row = r;col = c;element = new T[r*c];}////////////////////////////////測試的時候總是發現這個函數不對,調試總是沒找出問題///這是怎麼回事???怎麼回事??????template<typename T>Matrix<T>::Matrix(int r, int c, T* initval)//建構函式{row = r;col = c;int size = r*c;element = new T[size];for (int i=0;i<size;i++)element[i] = *(initval + i);}template<typename T>Matrix<T>::Matrix(const Matrix<T>& m) //拷貝建構函式{row = m.row;col = m.col;int size = row*col;element = new T[size];for (int i=0;i<size;i++)element[i] = m.element[i];}//圓括弧()重載為舉證的下標操作,對下標i和j(0<=i<row,0<=j<col)//輸出矩陣的第i行第j列元素,它在一維數組中的位置是i*col+jtemplate<typename T>T& Matrix<T>::operator()(int i,int j)const{if(i < 0 || i > row - 1 || j < 0 || j > col - 1)throw Bounds_error("下標越界!");//異常return element[i*col+j];}//賦值運算子多載template<typename T>Matrix<T>& Matrix<T>::operator=(const Matrix<T>& m){if(row != m.row || col != m.col)throw RCdismatch("行、列不匹配,不能賦值!");int size = row * col;for(int i=0;i<size;i++)element[i]=m.element[i];return *this;}//一元加運算子多載template<typename T>Matrix<T> Matrix<T>::operator+()const{}//二元加重載template<typename T>Matrix<T> Matrix<T>::operator+(const Matrix<T>& m){if(row != m.row || col != m.col)throw RCdismatch("行、列不匹配,不能賦值!");int size = row * col;for(int i=0;i<size;i++)element[i] += m.element[i];return this;}//一元減template<typename T>Matrix<T> Matrix<T>::operator-()const{}//二元減template<typename T> Matrix<T> Matrix<T>::operator-(const Matrix<T>& m)const{if(row != m.row || col != m.col)throw RCdismatch("行、列不匹配,不能賦值!");int size = row * col;for(int i=0;i<size;i++)element[i] -= m.element[i];return this;}//乘法,矩陣(*this)乘以矩陣mtemplate<typename T>Matrix<T> Matrix<T>::operator*(const Matrix<T>& m)const{if(col != m.row)throw RCdismatch("行、列不匹配,不能賦值!");Matrix<T> w(row,m.col);////這段是我自己寫的// int sum,k;// for (int i = 0; i < row; i ++)// {// for (int j = 0; j < m.col; j ++)// {// sum = 0;// for (k = 0; k < col; k ++)// {// sum +=(*this)(i,k)*m(k,j);// }// w(i,j) = sum;// }// }int r = 0;for (int i = 0; i < row; i ++){for (int j = 0; j < m.col; j ++){int p = i * col;//矩陣*this第i行第一個元素的位置int q = j;//矩陣第j列第一個元素的位置T sum = element[p]*m.element[q];for (int k = 1; k < col; k ++){p++;q+=m.col;sum+=element[p]*m.element[q];}w.element[r++] = sum;}}return w;}//轉置template<typename T>Matrix<T> Matrix<T>::transpose(){Matrix<T>m(col,row);//矩陣mfor(int i = 0; i < row; i ++){for(int j = 0; j < col; j ++){m(j,i) = (*this)(i,j);}}return m;}//輸出template<typename T>ostream& operator<<(ostream& out, const Matrix<T>& m){for (int i = 0; i < m.row; i ++){for (int j = 0; j < m.col; j ++)cout << setw(5)<<m(i,j);cout<<endl;}return out;}
//測試矩陣函數的程式//#include "matrix.h"#include "Matrix.cpp"using namespace std;int main(){int data1[12] = {5,7,8,2,-2,4,1,1,1,2,3,4};int data2[20] = {4,-2,3,3,9,4,3,8,-1,2,2,3,5,2,7,1,0,6,3,4};Matrix<int> A(3,4,data1);Matrix<int> B(4,5,data2);cout<<A.transpose();cout<<"=============="<<endl;cout<<B.transpose();cout<<"=============="<<endl;try{cout<<A*B<<endl;}catch (RCdismatch& e){e.display();cout<<endl;}catch (Bounds_error& e){e.display();cout<<endl;}return 0;}
調試的時候發現建構函式總是不對,唉,怎麼都找不出問題。