////////////////////////////////////////////////////////////////
//文件名:CMatrix.h
//功 能:矩阵类CMatrix的声明
//作 者:01计机(1)班 何海强 200124151109
////////////////////////////////////////////////////////////////
#ifndef _CMATRIX_H_
#define _CMATRIX_H_
class CMatrix //矩阵类
{
public:
//构造函数、析构函数、拷贝构造函数、赋值运算符
CMatrix(int row, int col);
~CMatrix();
CMatrix(const CMatrix &rhs);
CMatrix& operator=(const CMatrix &rhs);
//填充矩阵
bool setMatrix(const double *array, int size);
//获取矩阵中的所有元素
bool getMatrix(double *array);
//获取矩阵的行数
void getRow(int &row);
//获取矩阵的列数
void getCol(int &col);
//显示矩阵
bool display(void);
//矩阵相加
CMatrix operator+(const CMatrix &rhs);
//矩阵相减
CMatrix operator-(const CMatrix &rhs);
//矩阵相乘
CMatrix operator*(const CMatrix &rhs);
//常数与矩阵相乘
CMatrix operator*(double constant);
private:
double *m_matrix; //指向矩阵的指针
int m_row; //矩阵的行数
int m_col; //矩阵的列数
};
#endif
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//文件名:CMatrix.cpp
//功 能:矩阵类CMatrix的实现
//作 者:01计机(1)班 何海强 200124151109
////////////////////////////////////////////////////////////////
#include <iostream>
#include "CMatrix.h"
using namespace std;
//一般构造函数
CMatrix::CMatrix(int row, int col)
:m_matrix(NULL), m_row(0), m_col(0)
{
int length = 0;
//判断行数与列数是否合乎规定
if ((row < 1) || (col < 1))
{
return;
}
length = row * col;
m_matrix = new double[length]; //为矩阵分配内存空间
if (NULL == m_matrix)
{
return;
}
else
{
m_row = row;
m_col = col;
//首先用0来填充矩阵里面的所有元素
for (int index = 0; index < length; ++index)
{
m_matrix[index] = 0;
}
}
}
//析构函数
CMatrix::~CMatrix()
{
delete [] m_matrix; //释放矩阵所占用的内存
}
//拷贝构造函数
CMatrix::CMatrix(const CMatrix &rhs)
:m_matrix(NULL), m_row(rhs.m_row), m_col(rhs.m_col)
{
int length = 0;
if (NULL == rhs.m_matrix) //矩阵rhs为空
{
return;
}
length = m_row * m_col;
m_matrix = new double[length]; //为矩阵分配内存空间
if (NULL == m_matrix)
{
m_row = 0;
m_col = 0;
return;
}
else
{
//用rhs矩阵里面的元素来填充本矩阵
for (int index = 0; index < length; ++index)
{
m_matrix[index] = rhs.m_matrix[index];
}
}
}
//赋值运算符
CMatrix& CMatrix::operator=(const CMatrix &rhs)
{
int length = 0;
//判断是否自赋值
if (this != &rhs)
{
//释放原矩阵所占用的内存
delete [] m_matrix;
m_matrix = NULL;
m_row = 0;
m_col = 0;
//矩阵rhs是否为空
if (rhs.m_matrix != NULL)
{
length = rhs.m_row * rhs.m_col;
m_matrix = new double[length]; //为矩阵分配内存空间
if (m_matrix != NULL)
{
m_row = rhs.m_row;
m_col = rhs.m_col;
//用rhs矩阵里面的元素来填充本矩阵
for (int index = 0; index < length; ++index)
{
m_matrix[index] = rhs.m_matrix[index];
}
}
} //if ((rhs.m_row > 0) && (rhs.m_col > 0))
}
return *this; //返回本对象的引用
}
//填充矩阵
bool CMatrix::setMatrix(const double *array, int size)
{
if ((NULL == m_matrix) || (NULL == array))
{
return false;
}
if (size != (m_row * m_col)) //长度不相符
{
return false;
}
else
{
//用数组array里面的值来填充本矩阵
for (int index = 0; index < size; ++index)
{
m_matrix[index] = array[index];
}
return true;
}
}
//获取矩阵中的所有元素
bool CMatrix::getMatrix(double *array)
{
int length = 0;
if ((NULL == m_matrix) || (NULL == array))
{
return false;
}
else
{
length = m_row * m_col;
//用数组array来返回本矩阵中所有元素值
for (int index = 0; index < length; ++index)
{
array[index] = m_matrix[index];
}
return true;
}
}
//获取矩阵的行数
void CMatrix::getRow(int &row)
{
row = m_row;
}
//获取矩阵的列数
void CMatrix::getCol(int &col)
{
col = m_col;
}
//显示矩阵
bool CMatrix::display(void)
{
if (NULL == m_matrix) //本矩阵为空
{
return false;
}
else
{
//按行输出矩阵
for (int row = 0; row < m_row; ++row)
{
for (int col = 0; col < m_col; ++col)
{
cout << m_matrix[row * m_col + col] << '\t'; //同一行中的矩阵元素之间用一个tab 隔开
}
cout << '\n'; //准备输出下一行
}
return true;
}
}
//矩阵相加
CMatrix CMatrix::operator+(const CMatrix &rhs)
{
int length = 0;
//判断两个矩阵的行数与列数是否分别相等
if ((m_row == rhs.m_row) && (m_col == rhs.m_col))
{
if (NULL == m_matrix)
{
return *this; //返回一个空矩阵
}
else
{
CMatrix tempMatrix(m_row, m_col);
length = m_row * m_col;
for (int index = 0; index < length; ++index)
{
tempMatrix.m_matrix[index] = m_matrix[index] + rhs.m_matrix[index]; //相加
}
return tempMatrix; //返回相加后所得的矩阵
} //if ((m_row < 1) || (m_col < 1))
}
else
{
//定义一个空矩阵并返回它
CMatrix tempMatrix(0, 0);
return tempMatrix;
}
}
//矩阵相减
CMatrix CMatrix::operator-(const CMatrix &rhs)
{
int length = 0;
//判断两个矩阵的行数与列数是否分别相等
if ((m_row == rhs.m_row) && (m_col == rhs.m_col))
{
if (NULL == m_matrix)
{
return *this; //返回一个空矩阵
}
else
{
CMatrix tempMatrix(m_row, m_col);
length = m_row * m_col;
for (int index = 0; index < length; ++index)
{
tempMatrix.m_matrix[index] = m_matrix[index] - rhs.m_matrix[index]; //相减
}
return tempMatrix; //返回相减后所得的矩阵
} //if ((m_row < 1) || (m_col < 1))
}
else
{
//定义一个空矩阵并返回它
CMatrix tempMatrix(0, 0);
return tempMatrix;
}
}
//矩阵相乘
CMatrix CMatrix::operator*(const CMatrix &rhs)
{
if (m_col == rhs.m_row) //第一个矩阵的列数与第二个矩阵的行数相等
{
if (NULL == m_matrix)
{
return *this; //返回一个空矩阵
}
else
{
CMatrix tempMatrix(m_row, rhs.m_col);
for (int row = 0; row < m_row; ++row) //行
{
for (int col = 0; col < rhs.m_col; ++col) //列
{
for (int index = 0; index < m_col; ++index)
{
tempMatrix.m_matrix[row*rhs.m_col+col] +=
(m_matrix[row*m_col+index] * rhs.m_matrix[index*rhs.m_col+col]);
}
}
}
return tempMatrix;
} //if (NULL == m_matrix)
}
else
{
//定义一个空矩阵并返回它
CMatrix tempMatrix(0, 0);
return tempMatrix;
}
}
//常数与矩阵相乘
CMatrix CMatrix::operator*(double constant)
{
int length = 0;
//本矩阵是否为空
if (NULL == m_matrix)
{
return *this; //返回一个空矩阵
}
else
{
CMatrix tempMatrix(m_row, m_col);
length = m_row * m_col;
for (int index = 0; index < length; ++index)
{
tempMatrix.m_matrix[index] = m_matrix[index] * constant; //矩阵元素与常数相乘
}
return tempMatrix; //返回相乘后所得的矩阵
}
}
////////////////////////////////////////////////////////////////