📄 matrix.h
字号:
// MATRIX.h: interface for the CMATRIX class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MATRIX_H__5C15DE20_DF21_4D01_AFA2_53F52D2E6845__INCLUDED_)
#define AFX_MATRIX_H__5C15DE20_DF21_4D01_AFA2_53F52D2E6845__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//-----------------------------------------------
#include "Element.h"
#include "iostream.h"
//-----------------------------------------------
#define TMPPMAT(R,C) CMATRIX* pmat= new CMATRIX(R,C)
//#define TMPPMAT(R,C) CMATRIX* pmat=NULL;
#define PMATSET(R,C) pmat->SetRow(R);pmat->SetCol(C)
#define BACK return *pmat
//-----------------------------------------------
enum EXSTYLE { TOP , BOTTOM , LEFT , RIGHT }; //Expand类型
enum DTYPE { ONE , TWO , INF , FROB }; //范数类型
typedef struct _SORTTYPE
{
bool IsUp; //排序方向
bool IsCol;//某一行还是某一列
bool Syn; //其他的行或列是否同步
unsigned wer; //哪一行或列
} SORTYPE;
typedef struct _Extremum
{
unsigned row;
unsigned col;
double extremum;
} EXTREMUM;
//-----------------------------------------------
typedef struct V4
{
double x1;
double x2;
double x3;
double x4;
} dPOINT4;
typedef struct V2
{
double x1;
double x2;
} dPOINT2;
typedef struct V3
{
double x1;
double x2;
double x3;
public:
V3 operator *(const V3& a);
V3 operator -(const V3& a);
V3 operator +(const V3& a);
} dPOINT3;
//-----------------------------------------------
const double WKPI=3.14159265358979323846;
typedef double Angle; //角度值
typedef double Radian; //弧度值
//=====================================
inline Radian ToRad(Angle angle);//角度到弧度
inline Angle ToAng(Radian rad);//弧度到角度
double ctan(Radian rad);//余切
double csc(Radian rad);//余割
Radian actan(double r);//反余切
double Cos(Radian r);//重载余弦
double round(double num,unsigned n);//四舍五入
//=====================================
class CMATRIX
{
public:
friend int tao(CMATRIX& _v_); //求一组数序列的逆序数
public:
friend CMATRIX& Cos(CMATRIX& angles); //矩阵元素的(角度)余弦值
friend CMATRIX& arytomat(double ary[],unsigned n,
unsigned r,unsigned c=1,bool isLeftRight=true);
EXTREMUM ExtremumW(bool isMax=true); //获得矩阵的全局极值
//获得矩阵的局部极值
EXTREMUM Extremum(bool isMax=true,unsigned num=1,bool isCol=true);
//交换元素(r1,c1)与(r2,c2)
bool Swap(unsigned r1,unsigned c1,unsigned r2,unsigned c2);
//插入排序,并更新矩阵
void InsSort(SORTYPE sortype);
double Norm(DTYPE dtype=FROB);//矩阵的各种范数
static CMATRIX& ZERO(unsigned r,unsigned c);//生成r×c的零矩阵
//产生(l,q)为1,其余为零的r×c矩阵
static CMATRIX& BASE(unsigned l=1,unsigned q=1,
unsigned r=1,unsigned c=1);
static CMATRIX& IDENTITY(unsigned dim);//产生dim*dim的单位方阵
CMATRIX& Zero();//生成row×col的零矩阵
//向量则求其某一单位列向量,矩阵则
//得其指定行列为1,其余为0的单位矩阵
CMATRIX& Basis(unsigned lin=1,unsigned que=1);
//以原矩阵为行列数基础的类似矩阵标准形的矩阵
CMATRIX& Identity();
CMATRIX& Power(int pow=1);//求方阵的pow幂
CMATRIX& T();//矩阵的转置
//扩张矩阵,excursion>0:TOP&BOTTOM:_m_右移,
//LEFT&RIGHT:_m_下移;excursion指定相对位移
CMATRIX& Expand(CMATRIX& _m_,EXSTYLE exs=TOP,
int excursion=0);
CMATRIX& Remmat(unsigned r=1,unsigned c=1); //(i,j)的余子式矩阵
CMATRIX& KidMat(unsigned l1,unsigned l2,
unsigned q1,unsigned q2); //获取矩阵的子矩阵
CMATRIX& GetQue(unsigned que=1); //获取矩阵某一列成列向量
CMATRIX& GetLine(unsigned lin=1); //获取矩阵某一行成行向量
friend CMATRIX& inverse(CMATRIX& _m_); //求逆矩阵
friend CMATRIX& adjoint(CMATRIX& _m_); //求伴随矩阵
friend double det(CMATRIX& _m_); //求矩阵对应的行列式的值
friend CMATRIX& operator*(double k,CMATRIX& _m_); //矩阵的数乘
friend CMATRIX& operator*(CMATRIX& _m1_,CMATRIX& _m2_); //两矩阵相乘
friend CMATRIX& operator-(CMATRIX& _m1_,CMATRIX& _m2_); //两矩阵相减
friend CMATRIX& operator+(CMATRIX& _m1_,CMATRIX& _m2_); //两矩阵相加
double operator ()(unsigned r,unsigned c=1);//获取相应行列的元素值
inline double Cell(unsigned r,unsigned c);
double GetCell(unsigned l);//访问用户已添加的元素
//按值相等,不可出现连等(若要地址相等,
//则采用默认的拷贝构造函数)
void operator =(CMATRIX &_m_);
bool operator ==(CMATRIX &_m_);//判断两矩阵是否相等
inline unsigned Len();//获取矩阵中已经被用户赋值的元素的个数
inline unsigned Col();//获取矩阵的总列数
inline unsigned Row();//获取矩阵的总行数
inline void SetCol(unsigned c);//设置矩阵的总列数
inline void SetRow(unsigned r);//设置矩阵的总行数
//设置矩阵相应行和列的元素
bool SetCell(unsigned r,unsigned c,double it);
bool Append(const double& _item_);//依次添加矩阵元素
//矩阵类构造函数,一个参数时,为列向量。
//初始化时默认有一个元素,即row=col=1,
//值为0,但记录用户录入数据个数的len为0
CMATRIX(unsigned r=1,unsigned c=1);
virtual ~CMATRIX(); //矩阵类析构函数
bool Clear(); //清空矩阵并重新初始化
friend ostream& operator <<(ostream& output,CMATRIX& _m);
friend istream& operator >>(istream& in,CMATRIX& m_);
private:
inline bool SetCell(unsigned l,double cel);//添加矩阵的元素
//使得从左至右,从上到下,依次获取元素
inline unsigned RowColToLen(unsigned r,unsigned c);
void Destroy();//清空矩阵
bool Init();//矩阵数据初始化
private:
CElement* tail;//指向矩阵的尾元素
CElement* fence;//可更改的矩阵元素指针
CElement* head;//指向矩阵的第一个元素
//记录矩阵中已经输入的元素
//的个数,未录完之前不等于row*col
unsigned len;
unsigned col;//矩阵的总列数
unsigned row;//矩阵的总行数
};
typedef CMATRIX Matrix,Vector;
//////////////////////////////////////////////
#endif // !defined(AFX_MATRICES_H__5C15DE20_DF21_4D01_AFA2_53F52D2E6845__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -