矩阵类求解特征向量求逆协方差阵
矩阵无处不在。阅读到的资料是从行列式讲起的,据说读了《线性代数应该这样学》会有更多的收获然后在网上当了本过来看。从向量空间开始讲起觉得很抽象书里有很多证明题不知道是否能重燃兴趣。不过有句话“只有尝到梨子的甜头后才会知道梨子的味道”所以我决定尝梨子。
求解特征向量是矩阵运算中比较麻烦的事情尤其在编写程序时会发现很多细节尤其是精度和通用性问题。
广义Hebb算法在求解中很简单。这是神经网络的魅力所在。对于求解部分参看于 simon haykin著《神经网络与机器学习》,韩力群著《人工神经网络理论,设计及应用》
/*
-------------------------------------------------------------
作者:刘鑫
深圳市华羿光电设备有限公司任职于工程师
时间:写于2011年9月19日
CMatrix:基本的矩阵类
用于神经网络
*/
#if !defined CMatrix_H
#define CMatrix_H
#define nil -9999.999
class CMatrix:public CObject
{
public:
CMatrix();
CMatrix(int row,int col);
~CMatrix();
void Serialize(CArchive& ar);//串行化数据
BOOL SetData(int row,int col,double data);//设置row,col位置的数据
double GetData(int row,int col);//取得row,col位置的数据
BOOL Set_HH(int row,int col);//设置矩阵的行数和列数
int GetRow();//取得行数
int GetCol();//取得列数
int GetLength();//取得空间长度
void Show();//显示矩阵
double GetW();//计算行列式
BOOL GetA(CMatrix &a);//求伴随矩阵
BOOL GetN(CMatrix &a);//求逆矩阵公式法
BOOL GetNN(CMatrix &a);//求逆矩阵
BOOL GetT(CMatrix &a);//求转置矩阵
BOOL GetF();//满足|A|≠0的方阵A称为非奇异的,否则就称为奇异的
BOOL Getcov(CMatrix &m_covmatrix);//求协方差矩
/*
计算出矩阵特征值和特征向量m_matrix为特征向量存放矩阵,m_vc要求取特征个数
e:计算精度
learnc:学习常数
lentime:学习次数
PCA主量分析,使用广义的Hebb学习规则计算特征值和特征矩阵
T.D.Sanger在1989年提出
*/
BOOL GetCharValVector(CMatrix &m_matrix,int m_vc,double e,double learnc,int lentime);
//根据特征值和特征向量重构矩阵,m_charmatrix为特征向量矩阵
CMatrix ReMatrix(CMatrix m_charmatrix);
//根据特征向量和特征值压缩矩阵,m_charmatrix特征向量矩阵,vc压缩到的维数
CMatrix ComprMatrix(CMatrix m_charmatrix,int vc);
CMatrix AverageMatrixZero();//求取矩阵平均值为0的矩阵
double GetRowSum(int n);//计算行和
double GetColSum(int n);//计算列和
CMatrix GetRowM(int row);//取得行矩阵
CMatrix GetColM(int col);//取得列矩阵
BOOL SetRowM(CMatrix m_setm,int row);//将矩阵设置到矩阵的第row行中
BOOL SetColM(CMatrix m_setm,int col);//将矩阵设置到矩阵的第col列中
BOOL delCol(int n);//删除第N列
BOOL delRow(int n);//删除第N行
BOOL GetMaxMin(double &max,double &min);//取得最大最小
BOOL GetMaxMin();//取得最大最小
BOOL SetMaxMin(double max,double min);//设置最大最小
BOOL Normalize();//矩阵归一化
BOOL Normailze(CMatrix &e);//矩阵归一化
BOOL BeBack();//矩阵还原
BOOL BeBack(CMatrix &e);//矩阵还原
BOOL SetBe(double be);//取得缩放比例
double GetBe();//取得缩放比例
void OutFile(CString fname);//输出到文件
//
CMatrix(const CMatrix &);
CMatrix operator=(const CMatrix &);
CMatrix operator+(CMatrix);
CMatrix operator-(CMatrix);
CMatrix operator*(CMatrix);
CMatrix operator*(double);
public:
double m_sc;//归一化还原缩放比例
private:
int m_Length;
int m_row;
int m_col;
int Getpos(int row,int col);
double *m_DataBuf;
double m_max;//矩阵最大值
double m_min;//矩阵最小值
private:
//PCA Hebb学习规则使用如下私有函数操作
double Random();//随机0附近小数
/*
sanger法求取调整权变量
t时刻输入样本向量
mchartvalue 即输出层输出构成的向量
m_chartvector 特征向量矩阵
yn 求取的第yn个主分量,从0开始
*/
CMatrix GetPX(CMatrix Xt,CMatrix mchartvalue,CMatrix m_chartvector,int yn);
protected:
};
#endif