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

📄 mainfactor.cpp

📁 基于vc环境开发的主成分分析软件
💻 CPP
字号:
// MainFactor.cpp: implementation of the MainFactor class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ProGram2.h"
#include "MainFactor.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MainFactor::MainFactor()
{

}

MainFactor::~MainFactor()
{

}
MainFactor::MainFactor(CMatrix A,double p,int Tag)
{
	m_Matrix1=A;
	m_p=p;
	m_t=Tag;
}

CMatrix MainFactor::GetL(CMatrix B)        
{
	CMatrix MatrixX(B);
	CMatrix MatrixL(B);
	int m=MatrixX.GetNumRows();
	int n=MatrixX.GetNumCols();
	for(int i=0;i<m;i++)
	{	
		double p=0.0;
		for(int j=0;j<n;j++)
		{
			p=p+MatrixX.GetElement(i,j);
		}
		for(int k=0;k<n;k++)
		{   
			MatrixX.SetElement(i,k,MatrixX.GetElement(i,k)-p/n);
		}
	}
MatrixL=MatrixX*MatrixX.Transpose();
return MatrixL;
}

CMatrix MainFactor::GetStX()
{
	CMatrix MatrixX(m_Matrix1);
	CMatrix MatrixL=GetL(m_Matrix1);
	int m=MatrixX.GetNumRows();
	int n=MatrixX.GetNumCols();
	for(int i=0;i<m;i++)
	{	
		double p=0.0;
		for(int j=0;j<n;j++)
		{
			p=p+MatrixX.GetElement(i,j);
		}
		for(int k=0;k<n;k++)
		{   
			MatrixX.SetElement(i,k,(MatrixX.GetElement(i,k)-p/n)/sqrt(MatrixL.GetElement(i,i)/(n-1)));
		}
	}
return MatrixX;
}
CMatrix MainFactor::GetS()
{
	CMatrix MatrixL=GetL(m_Matrix1);
	int n=m_Matrix1.GetNumCols();
	CMatrix MatrixS;
	MatrixS=MatrixL*((double) 1/(n-1));
	return MatrixS;
}
CMatrix MainFactor::GetR()
{
	CMatrix MatrixX=GetStX();
	CMatrix MatrixL=GetL(MatrixX);
	int n=MatrixL.GetNumCols();
	CMatrix MatrixR;
	MatrixR.Init(n,n);
	for(int i=0;i<n;i++)
	{
		double k1=MatrixL.GetElement(i,i);
		for(int j=0;j<n;j++)
		{
			double k2=MatrixL.GetElement(j,j);
			MatrixR.SetElement(i,j,MatrixL.GetElement(i,j)/sqrt(k1*k2));	
		}
	}
	return MatrixR;
}

void MainFactor::Analyze1()
{
	CMatrix MatrixF;	//分析所用的矩阵(协方差阵或相关阵)
//	CMatrix MatrixT;		
	if (m_t==0)
	{
		MatrixF=GetS();
		m_Matrix2=m_Matrix1;
	//	show(m_Matrix2);
	//	show(MatrixF);
		
	}
	else
	{
		m_Matrix2=GetStX();
		MatrixF=GetR();
		//show(MatrixF);
	}
	CMatrix MatrixT(MatrixF.Eigenv());
	CMatrix m_Result11(3,MatrixT.GetNumCols());
	double k=0;	
	double tr=0;
	int j=0;
	int d=1;
	
	for(int h=0;h<MatrixT.GetNumCols();h++)
	{
		tr=tr+MatrixT.GetElement(0,h);
	}
	
	while (k<m_p)
	{
		k=k+MatrixT.GetElement(0,j)/tr;//计算主成分的累计方差贡献率
		m_Result11.SetElement(0,j,MatrixT.GetElement(0,j));
		m_Result11.SetElement(1,j,MatrixT.GetElement(0,j)/tr);
		m_Result11.SetElement(2,j,k);
		j=j+1;	
	}
	m_mainNum=j;
	m_Result1.Init(3,3);
	m_Result1.Init(3,j);
	CMatrix MatrixU(j,j);
	m_Result2.Init(MatrixT.GetNumCols(),j);
	m_Result3.Init(m_Matrix2.GetNumCols(),MatrixT.GetNumCols());
	m_Result4.Init(MatrixT.GetNumCols(),j);
	for(int i=0;i<j;i++)
	{	
		for(int q=0;q<3;q++)
		{
			m_Result1.SetElement(q,i,m_Result11.GetElement(q,i));       // 主成分的特征根、贡献率和累计贡献率
		}
		for(int r=0;r<m_Result2.GetNumRows();r++)
		{
			m_Result2.SetElement(r,i,MatrixT.GetElement(r+1,i));
		}
		MatrixU.SetElement(i,i,sqrt(MatrixT.GetElement(0,i)));
	}
m_Result3=m_Matrix2.Transpose()*m_Result2;	
m_Result4=m_Result2*MatrixU;	                       
}
void MainFactor::showMatrix(CMatrix a)
{
	if(a.GetNumCols==0)
		return;
	CString s,c;
	for(int i=0;i<a.GetNumRows();i++)
	{
		s="";
		for(int j=0;j<a.GetNumCols();j++)
		{
			c.Format("    %f",(double)a.GetElement(i,j));
			s=s+c;
		}
		AfxMessageBox(s);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -