模板类Matrix with 加法、乘法

来源:互联网 发布:熊猫烧香软件下载 编辑:程序博客网 时间:2024/05/10 11:57

http://www.coder4.com/archives/363

 

题目:
编写模板类matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int, double, 类complex(包含实数real,虚数virt两部分)等数据类型测试所写matrix类接口
 
题目:
 
编写模板类matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int, double, 类complex(包含实数real,虚数virt两部分)等数据类型测试所写matrix类接口
 
题目:
编写模板类matrix,支持任意数据类型的矩阵,重载+,-,*,=,==,[]等操作。利用int, double, 类complex(包含实数real,虚数virt两部分)等数据类型测试所写matrix类接口
查看源代码
 
打印帮助
/********************************************
   CopyRight 2007 北京交通大学 计科0601 李赫元
   程序名称:   Matrix模板类
   文件名:     Matrix.h
   修改日期:   2007-4-14 19:51:59
   描述:       定义、实现了Matrix模板类
********************************************/
 
#include <iostream>
 
template <class T>
class Matrix
{
public:
//构造函数、拷贝函数、赋值
Matrix(int r,int c);
Matrix(const Matrix<T> &M);
Matrix();
Matrix<T>   operator =   (const Matrix<T> & rMatrix);
 
~Matrix(){delete m_elem;}
 
//输出矩阵
void Print();
 
int GetRow(){ return m_row;}
int GetCol(){ return m_col;}
 
//操作符的重载
T&         operator [] (int pos);
Matrix<T>   operator +   (const Matrix<T> & rMatrix);
Matrix<T>   operator *   (const Matrix<T> & rMatrix);
bool   operator == (const Matrix<T> & rMatrix);
 
private:
 
//指向数据区的指针
T * m_elem;
 
//记录行列
int m_row,m_col;
};
 
template <class T>
Matrix<T>::Matrix(int r,int c)
:m_row(r),m_col(c)
{
if(m_col==0 || m_row==0)
   m_elem=NULL;
else
{
   m_elem = new T[m_row * m_col];
   if (!m_elem)
   {
    throw Error("无法分配内存");
   }
 
   cout<<"创建一个"<<m_row<<"×"<<m_col<<"的矩阵..."<<endl;
   for(int irow=0;irow != m_row; ++irow)
   {
    cout<<"请输入第"<<irow+1<<"行数据(每行"<<m_col<<"个)";
    for(int icol=0;icol != m_col; ++icol)
    {
     cin >> m_elem[irow * m_col + icol];
    }
}
}
 
}
 
template <class T>
T& Matrix<T>::operator [] (int pos)
{
return m_elem[pos];
}
 
template <class T>
Matrix<T> Matrix<T>::operator   + (const Matrix<T> & rMatrix)
{
if(this->m_row != rMatrix.m_row || this->m_col != rMatrix.m_col)
   throw Error("不同型矩阵无法相加!");
else
{
   Matrix<T> mResult(*this);
 
   for(int i = 0;i != m_row * m_col;++i)
   {
    mResult.m_elem[i] += rMatrix.m_elem[i];
   }
   return mResult;
}
 
}
 
template <class T>
Matrix<T>::Matrix(const   Matrix<T> &M)
{
this->m_elem = new T[M.m_row * M.m_col];
 
if (!m_elem)
{
   throw Error("无法分配内存");
}
 
m_row = M.m_row;
m_col = M.m_col;
memcpy(m_elem,M.m_elem,sizeof(T) * m_row * m_col);
 
}
 
template <class T>
Matrix<T> Matrix<T>::operator =   (const   Matrix<T> &M)
{
this->m_elem = new T[M.m_row * M.m_col];
 
if (!m_elem)
{
   throw Error("无法分配内存");
}
 
m_row = M.m_row;
m_col = M.m_col;
memcpy(m_elem,M.m_elem,sizeof(T) * m_row * m_col);
 
return *this;
}
 
template <class T>
Matrix<T>   Matrix<T>::operator *   (const Matrix<T> & mRight)
{
 
if(this->m_col != mRight.m_row)
   throw Error("两个矩阵不满足相乘条件!");
else
{
   Matrix<T> Result(0,0);
 
   Result.m_elem = new T [m_row * mRight.m_col];
   Result.m_row   = m_row;
   Result.m_col   = mRight.m_col;
   memset(Result.m_elem,0,sizeof(T) * m_row * mRight.m_col);
 
   for(int irow=0;irow!=Result.m_row;++irow)
   {
    for(int icol=0;icol!=Result.m_col;++icol)
    {
     //上述两层循环,确定要算出的Result中元素
     T sum=0;
 
     //i,j为左右矩阵在各自数组中下标
 
     for(int i=irow * m_col,j=icol,cnt=0; cnt != m_col ; ++i,j+=mRight.m_col,++cnt)
       sum+=this->m_elem[i] * mRight.m_elem[j];
 
     Result.m_elem[irow * Result.m_col + icol]=sum;
    }
   }
   return Result;
}
}
 
template <class T>
void Matrix<T>::Print()
{
for(int i = 0 ;i != m_row * m_col;++i)
{
 
   cout<< setw(4) <<m_elem[i]<<"    ";
 
   if(!((i+1) % m_col))
    cout<<endl;
 
}
}
template<class T>
Matrix<T>::Matrix()
{
cout<<"/n请输入行数 列数:";
cin>>m_row>>m_col;
 
m_elem = new T[m_row * m_col];
if (!m_elem)
{
   throw Error("无法分配内存");
}
 
cout<<"创建一个"<<m_row<<"×"<<m_col<<"的矩阵..."<<endl;
for(int irow=0;irow != m_row; ++irow)
{
   cout<<"请输入第"<<irow<<"行数据(每行"<<m_col<<"个)";
   for(int icol=0;icol != m_col; ++icol)
   {
 
    cin >> m_elem[irow * m_col + icol];
   }
}
}
 
template<class T>
bool   Matrix<T>::operator == (const Matrix<T> & rMatrix)
{
if (m_col != rMatrix.m_col || m_col != rMatrix.m_row)
{
   return false;
}
else
{
   for(int i=0;i != m_row * m_col;++i)
    if (m_elem[i] != rMatrix.m_elem[i])
    {
     return false;
    }
   return true;
}
}
 
/********************************************
   CopyRight 2007 北京交通大学 计科0601 李赫元
   工程名称:   Matrix模板类
   文件名:     Error.h
   修改日期:   2007-4-14 20:04:07
   描述:       描述和定义了错误类
********************************************/
 
#include <iostream>
#include <string>
using namespace std;
 
class Error
{
public:
Error(const string &str):m_err_info(str){}
void ShowErr(){ cout<<m_err_info;};
private:
string m_err_info;
};
 
/********************************************
   CopyRight 2007 北京交通大学 计科0601 李赫元
   程序名称:   Matrix模板类
   文件名:     main.cpp
   修改日期:   2007-4-14 19:23:08
   描述:       main函数,测试加法,乘法,==等
********************************************/
 
#include <iostream>
#include <iomanip>
#include "Error.h"
#include "Matrix.h"
using namespace std;
 
int main()
{
try
{
   cout<<"创建矩阵m1:";
   Matrix<double> m1;
   cout<<"/n创建矩阵m2:";
   Matrix<double> m2;
   Matrix<double> m3(0,0);
 
   cout<<"计算m3=m1*m2/n";
   m3 = m1 * m2;
 
   cout<<"/n输出矩阵m3:"<<endl;
   m3.Print();
 
   cout<<"/n创建矩阵m4:";
   Matrix<double> m4;
   Matrix<double> m5(0,0);
   m5 = m3 + m4;
 
   cout<<"/n计算m5=m3+m4:/n输出m5:"<<endl;
   m5.Print();
 
   cout<<"/n创建矩阵m6:";
   Matrix<double> m6;
   cout<<"/nm5==m6:"<<(m5==m6);
}
catch(Error err)
{
   cout<<endl;
   err.ShowErr();
}
return 0;
}