1. 矩阵的定义
矩阵可以描述为一个二元数组,矩阵的下标通常从1开始。下面是利用上节提到的行优先映射的方法来对矩阵进行实现。
1.1 矩阵的实现
#pragma once
#include <iostream>
//矩阵类
template<typename elemType>
class Matirx
{
protected:
//矩阵的数据成员
elemType* elems;//存储矩阵元素
int rows, cols;//矩阵的行和列
private:
//抽象数据类型及重载编译系统的默认方法声明
Matirx(int rs, int cs);//构造函数
~Matirx();//析构函数
int getRows() const;//返回矩阵的行数
int getCols() const;//返回矩阵的列数
elemType& operator()(int i, int j);
Matirx(const Matirx<elemType> & copy);
Matirx<elemType>& operator=(const Matirx<elemType> & copy);
};
template<typename elemType>
Matirx<elemType>::Matirx(int rs, int cs)
{
if ( rs > 0 && cs > 0)
{
elems = new elemType[rs * cs];
rows = rs;
cols = cs;
}
else
{
std::cout << "行数或列数无效!" << std::endl;
}
}
template<typename elemType>
Matirx<elemType>::~Matirx()
{
if (elems != NULL) delete []elems;
}
template<typename elemType>
int Matirx<elemType>::getRows() const
{
return rows;
}
template<typename elemType>
int Matirx<elemType>::getCols() const
{
return cols;
}
template<typename elemType>
elemType& Matirx<elemType>::operator()(int i, int j)
{
if (i < 1 || i > rows || j < 1 || j > cols)
{
std::cout << "下标越界!" << std::endl;
}
else
{
return elems[(i-1)*cols + j - 1]
}
}
template<typename elemType>
Matirx<elemType>::Matirx(const Matirx<elemType> & copy)
{
rows = copy.rows;
cols = copy.cols;
elems = new elemType[rows * cols];
for (int i = 0; i < rows*cols; i++)
{
elems[i] = copy.elems[i];
}
}
template<typename elemType>
Matirx<elemType>& Matirx<elemType>::operator=(const Matirx<elemType> & copy)
{
if (© != this)
{
if (elems != NULL) delete[]elems;
rows = copy.rows;
cols = copy.cols;
elems = new elemType[rows * cols];
for (int i = 0; i < rows*cols; i++)
{
elems[i] = copy.elems[i];
}
}
}
2.特殊矩阵
如果值相同元素或者零元素在矩阵中按一定的规律分布,这样的矩阵称为特殊矩阵。
下面介绍一些基本概念:
方阵:行数和列数相同矩阵,下面介绍的矩阵都是特殊矩阵。
对称矩阵:对于对称阵,对于所有的 i i 和
有 a(i,j)=a(j,i) a ( i , j ) = a ( j , i ) .
三对角阵:当