矩陣的實現(矩陣相加)

#include <iostream>
using namespace std;


class Matrix
{
private:
int rows,columns;  //矩陣行數列數
int **element;  //動態二維數組


void InitiaMatrix(int rows,int columns);  //申請並初始化指定行數列數的空矩陣


public:
Matrix(int rows=4,int column=4);//構造矩陣
Matrix(int *mat,int rows,int column);//以一維數組構造矩陣
~Matrix(); //析構函數


int GetElem(int i,int j);  //返回第i行j列元素值
bool SetValue(int i,int j,int value);//設置第i行j列元素值爲value
friend ostream& operator<<(ostream& out,Matrix &mat);//輸出矩陣中所有元素
Matrix& operator+=(Matrix& mat); //當前矩陣與mat矩陣相加
Matrix(Matrix &mat);   // 以已知對象構造矩陣
Matrix operator +(Matrix& mat);  //返回當前矩陣與mat相加後的矩陣
};


void Matrix::InitiaMatrix(int rows, int columns)  //申請並初始化指定行數的
{
   if(rows<=0 || columns<=0)
 throw "異常";
    this->rows = rows;
   this->columns = columns;
   element = new int *[rows];   // 申請rows個一維數組,元素類型爲int*
   for(int i=0;i<rows;i++)
   {
      element[i] = new int[columns];  //爲每行申請columns個元素的一維數組,元素類型爲int
 for(int j=0;j<columns;j++)
    element[i][j] = 0;
   }
}


Matrix::Matrix(int rows, int columns)  // 構造rows行columns列矩陣,元素爲0 
{
   InitiaMatrix(rows,columns);
}


Matrix::Matrix(int *mat, int rows, int column)
{
   InitiaMatrix(rows,columns);
   for(int i=0;i<rows;i++)
  for(int j=0;j<columns;j++)
  element[i][j] = *(mat+i*columns+j);
}


Matrix::~Matrix()
{
   for(int i=0;i<rows;i++)  //釋放動態二維數組佔用的內存空間
  delete(element[i]);
   delete(element);
}


int Matrix::GetElem(int i, int j)  //返回第i行j列元素
{
   if(i>=0 && i<rows && j>=0 &&j<columns)
  return element[i][j];
   throw "矩陣元素的行或列序號越界異常";
}


bool Matrix::SetValue(int i, int j, int value)  //設置第i行j列的元素爲value
{
   if(i>=0 && i<rows && j>=0 &&j<columns)
   {
       element[i][j] = value;
  return true;
   }
   return false;
}


ostream& operator <<(ostream&out, Matrix &mat)  //輸出矩陣中所有元素
{
out<<"  矩陣Matrix("<<mat.rows<<"x"<<mat.columns<<"):"<<endl;
for(int i=0;i<mat.columns;i++)
{
 for(int j=0;j<mat.columns;j++)
 out<<mat.element[i][j]<<" ";
 out<<"\n";
}
return out;
}


Matrix&Matrix::operator +=(Matrix &mat)  //當前矩陣與mat矩陣相加
{
    if(this->rows == mat.rows&&this->columns==mat.columns)
{
   for(int i=0;i<mat.rows;i++)
for(int j=0;j<mat.columns;j++)
element[i][j]+=mat.element[i][j];
return *this;
}
throw "倆個矩陣介數不同,不能相加";
}


Matrix::Matrix(Matrix &mat)  //由已知對象構造矩陣對象
{
   this->rows = mat.rows;
   this->columns = mat.columns;
   this->element = new int *[rows];
   for(int i=0;i<rows;i++)
   {
       element[i] = new int[columns];
  for(int j=0;j<columns;j++)
  element[i][j] = mat.element[i][j];
   }
}


Matrix Matrix::operator +(Matrix &mat) //返回當前矩陣和mat相加後的矩陣
{
   if(this->rows==mat.rows&&this->columns==mat.columns)
   {
      Matrix mat3(*this);
 mat3 += mat;
 return mat3;
   }
  throw"倆個矩陣階數不同,不能相加";
}

#define _CRT_SECURE_NO_WARNINGS 
#include "Matrix.h"


int main()
{
   const int M=3, N=3;


   int table1[M*N] = {0,4,3,5,1,1};
   Matrix mat1(table1,M,N);
   mat1.SetValue(2,2,1);
   int table2[M][N] = {5,2,1,1,8,1,0,0,9};
   Matrix mat2(&table2[0][0],M,N);  // 二維數組轉換爲一維數組構造矩陣對象
   cout<<mat1<<mat2;
   mat1+=mat2;
   cout<<"矩陣相加\n"<<mat1;
   return 0;
}


發佈了46 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章