⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.h

📁 各种矩阵运算的实现
💻 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 + -