📄 200622130035view.cpp
字号:
// 200622130035View.cpp : implementation of the CMy200622130035View class
//
#include "stdafx.h"
#include "200622130035.h"
#include "200622130035Doc.h"
#include "200622130035View.h"
#define initRow 21
#define initCol 9
#define DistRow 21
#define DistCol 21
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View
IMPLEMENT_DYNCREATE(CMy200622130035View, CScrollView)
BEGIN_MESSAGE_MAP(CMy200622130035View, CScrollView)
//{{AFX_MSG_MAP(CMy200622130035View)
ON_COMMAND(IDM_ANALYSIS_READDATA, OnAnalysisReaddata)
ON_COMMAND(IDM_ANALYSIS_BZC, OnAnalysisBzc)
ON_COMMAND(IDM_ANALYSIS_DISTANCE, OnAnalysisDistance)
ON_COMMAND(IDM_ANALYSIS_JL, OnAnalysisJl)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View construction/destruction
CMy200622130035View::CMy200622130035View()
{
// TODO: add construction code here
initData=NULL;
DataTrans=NULL;
DataDist=NULL;
PreData=NULL;
Disp_Init=FALSE;
Disp_Trans=FALSE;
Disp_Dist=FALSE;
Disp_PXT=FALSE;
}
CMy200622130035View::~CMy200622130035View()
{
delete []initData;
delete []DataTrans;
delete []DataDist;
delete []PreData;
}
BOOL CMy200622130035View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View drawing
void CMy200622130035View::OnDraw(CDC* pDC)
{
CMy200622130035Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if(Disp_Init==TRUE||Disp_Trans==TRUE||Disp_Dist==TRUE)
{
CSize sizeTotal;
sizeTotal.cx = 1500;
sizeTotal.cy = 800;
SetScrollSizes(MM_TEXT, sizeTotal);
}
if(Disp_Init==TRUE)
{
if(initData!=NULL)
{
pDC->TextOut(0,0,"原始数据:");
DisplayData(pDC,initData,initRow,initCol);
}
else
MessageBox("请读取数据");
}
else if(Disp_Trans==TRUE)
{
pDC->TextOut(0,0,"标准差标准化后的数据:");
DisplayData(pDC,DataTrans,initRow,initCol);
}
else if(Disp_Dist==TRUE)
{
pDC->TextOut(0,0,"欧氏距离:");
DisplayData(pDC,DataDist,DistRow,DistCol);
}
else if(Disp_PXT==TRUE)
{
m_nPosY = 30;
CPoint RootPos = Postrav(bootNode,pDC);
}
else
pDC->TextOut(0,0,"请打开数据文件!");
}
void CMy200622130035View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View printing
BOOL CMy200622130035View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMy200622130035View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMy200622130035View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View diagnostics
#ifdef _DEBUG
void CMy200622130035View::AssertValid() const
{
CScrollView::AssertValid();
}
void CMy200622130035View::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CMy200622130035Doc* CMy200622130035View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy200622130035Doc)));
return (CMy200622130035Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMy200622130035View message handlers
void CMy200622130035View::OnAnalysisReaddata()
{
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"txt files(.txt)|*.txt||",NULL);
CString sFilePath;
if(IDOK==dlg.DoModal())
{
sFilePath=dlg.GetPathName();
initData=new float[initRow*initCol];
ReadDataToArray(sFilePath,initData,initRow,initCol);
Disp_Init=TRUE;
Disp_Trans=FALSE;
Disp_Dist=FALSE;
Invalidate();
}
}
//从文件中读数据
void CMy200622130035View::ReadDataToArray(CString sFilePath,float* initData,int Row,int Col)
{
ifstream fin;
fin.open(sFilePath);
float temp;
for(int i=0;i<Row;i++)
{
for(int j=0;j<Col;j++)
{
fin>>temp;
*(initData+i*Col+j)=temp;
}
}
fin.close();
}
//显示数据
void CMy200622130035View::DisplayData(CDC* pDC,float *Data, int Row, int Col)
{
CString str;
int XOffset=70,YOffset=20;
int X=20,Y=20;
for(int i=0;i<Row;i++)
{
for(int j=0;j<Col;j++)
{
str.Format("%.3f",*(Data+i*Col+j));
pDC->TextOut(X+XOffset*j,Y+YOffset*i,str);
}
}
}
//将数据进行标准差标准化
void CMy200622130035View::OnAnalysisBzc()
{
if(initData==NULL)
{
MessageBox("请打开数据文件!");
return;
}
DataTrans=new float[initRow*initCol];
TransData(DataTrans,initData,initRow,initCol);
Disp_Init=FALSE;
Disp_Trans=TRUE;
Disp_Dist=FALSE;
Invalidate();
}
//原始数据某一列的标准差
float CMy200622130035View::GetStdDeviationOfCol(float *initData, int Col,int Row,int c)
{
float Average=GetAverageOfCol(initData,Col,Row,c);
float sum=0;
for(int i=0;i<Row;i++)
{
sum+=(*(initData+i*Col+c-1)-Average)*(*(initData+i*Col+c-1)-Average);
}
sum=sum/Row;
return (float)sqrt(sum);;
}
//原始数据某一列的平均值
float CMy200622130035View::GetAverageOfCol(float *initData, int Col,int Row,int c)
{
float sum=0;
for(int i=0;i<Row;i++)
{
for(int j=0;j<Col;j++)
{
if(j==c-1)
sum+=*(initData+i*Col+j);
}
}
return sum/Row;
}
//利用标准差标准化数据
void CMy200622130035View::TransData(float *DataTrans, float *initData, int Row, int Col)
{
int i,j;
for(i=0;i<Row;i++)
{
for(j=0;j<Col;j++)
{
*(DataTrans+i*Col+j)=(*(initData+i*Col+j)-GetAverageOfCol(initData,Col,Row,j+1))/GetStdDeviationOfCol(initData,Col,Row,j+1);
}
}
}
//计算距离
void CMy200622130035View::OnAnalysisDistance()
{
// TODO: Add your command handler code here
DataDist=new float[DistRow*DistCol];
for(int i=0;i<DistRow;i++)
{
for(int j=0;j<DistCol;j++)
{
*(DataDist+i*DistCol+j)=GetEuclideanDistance(DataTrans,initRow,initCol,i,j);
}
}
Disp_Init=FALSE;
Disp_Trans=FALSE;
Disp_Dist=TRUE;
Invalidate();
}
//计算欧氏距离
float CMy200622130035View::GetEuclideanDistance(float *DataTrans, int Row, int Col, int Row1, int Row2)
{
float sum=0;
for(int i=0;i<Col;i++)
{
sum+=(*(DataTrans+Row1*Col+i)-*(DataTrans+Row2*Col+i))*(*(DataTrans+Row1*Col+i)-*(DataTrans+Row2*Col+i));
}
return (float)sqrt(sum);
}
void CMy200622130035View::OnAnalysisJl()
{
// TODO: Add your command handler code here
int initUnitNum=21;
PreData=new float[DistRow*DistCol];
InitCluster(DataDist,PreData,initUnitNum);
CClusterStdDlg dlg;
float Distance;
if(IDOK==dlg.DoModal())
{
Distance=dlg.m_distance;
}
int nodeNum=initUnitNum+initUnitNum-1;
nodes=new btnode[nodeNum];
for(int n=0;n<nodeNum;n++)
{
nodes[n].id=n;
nodes[n].dis=0;
nodes[n].lchild=NULL;
nodes[n].rchild=NULL;
}
float value;
int row,col;
ofstream fout;
fout.open("cls.txt");
int i=0;
while(1)
{
GetMinimumDistance(PreData,initUnitNum+i,initUnitNum+i,&value,&row,&col);
if(value<=Distance)
{
fout<<col+1<<' '<<row+1<<' '<<value<<' '<<initUnitNum+i+1<<endl;
nodes[initUnitNum+i].dis=value;
nodes[initUnitNum+i].lchild=nodes+row;
nodes[initUnitNum+i].rchild=nodes+col;
PreData=NewData(PreData,initUnitNum+i,row,col);
}
else
break;
i++;
}
fout.close();
bootNode=&nodes[nodeNum-1];
Disp_Init=FALSE;
Disp_Trans=FALSE;
Disp_Dist=FALSE;
Disp_PXT=TRUE;
Invalidate();
}
//获得矩阵中最小值
//value 最小值 r 最小值所在行 c 最小值所在列(从0起始)
void CMy200622130035View::GetMinimumDistance(float *DistData, int Row, int Col, float* value, int* r, int* c)
{
int i,j;
float min;
min=*(DistData+Col);
for(i=0;i<Row;i++)
{
for(j=0;j<Col;j++)
{
if(i>j)
{
if(*(DistData+i*Col+j)<=min)
{
min=*(DistData+i*Col+j);
*r=i;
*c=j;
}
}
}
}
*value=min;
}
//获得某个类别中的单元数
int CMy200622130035View::GetUnitNumOfCls(CString sFilePath, int Cls, int initUnitNum)
{
if(Cls<=initUnitNum)
return 1;
else
{
ifstream fin;
fin.open(sFilePath);
int row,col;
float value;
int c;
while(!fin.eof())
{
fin>>row>>col>>value>>c;
if(c==Cls)
{
return GetUnitNumOfCls(sFilePath,row,initUnitNum)+GetUnitNumOfCls(sFilePath,col,initUnitNum);
}
}
}
return 0;
}
void CMy200622130035View::InitCluster(float *initDataDist, float *PreData, int initUnitNum)
{
for(int i=0;i<initUnitNum;i++)
{
for(int j=0;j<initUnitNum;j++)
{
*(PreData+i*initUnitNum+j)=*(initDataDist+i*initUnitNum+j);
}
}
}
float* CMy200622130035View::NewData(float *PreData, int PreDataUnitNum,int minRow,int minCol)
{
float* temp=new float[(PreDataUnitNum+1)*(PreDataUnitNum+1)];
for(int i=0;i<PreDataUnitNum+1;i++)
{
for(int j=0;j<PreDataUnitNum+1;j++)
{
if(i!=PreDataUnitNum&&j!=PreDataUnitNum)
{
if(i!=minRow&&j!=minRow&&i!=minCol&&j!=minCol)
*(temp+i*(PreDataUnitNum+1)+j)=*(PreData+i*PreDataUnitNum+j);
else
*(temp+i*(PreDataUnitNum+1)+j)=100;
}
else
{
if(i==PreDataUnitNum&&j==PreDataUnitNum)
*(temp+i*(PreDataUnitNum+1)+j)=0;
else
{
int tt;
if(i<j)
tt=i;
else tt=j;
if(tt==minRow||tt==minCol)
*(temp+i*(PreDataUnitNum+1)+j)=100;
else
*(temp+i*(PreDataUnitNum+1)+j)=GetDistance(PreData,PreDataUnitNum,minRow,minCol,tt);
}
}
}
}
return temp;
}
float CMy200622130035View::GetDistance(float* PreData,int PreDataUnitNum,int minRow, int minCol, int Cur)
{
CString str="cls.txt";
int initUnitNum=21;
float Np=(float)GetUnitNumOfCls(str,minRow+1,initUnitNum);
float Nq=(float)GetUnitNumOfCls(str,minCol+1,initUnitNum);
return (float)sqrt((*(PreData+minRow*PreDataUnitNum+Cur))*(*(PreData+minRow*PreDataUnitNum+Cur))*Np/(Np+Nq)+(*(PreData+minCol*PreDataUnitNum+Cur))*(*(PreData+minCol*PreDataUnitNum+Cur))*Nq/(Np+Nq));
}
CPoint CMy200622130035View::Postrav(btnode *pBoot, CDC *pDC)
{
CPoint lPt,rPt,mPt;
if(pBoot->lchild != NULL && pBoot->rchild != NULL)
{
lPt = Postrav(pBoot->lchild,pDC);
rPt = Postrav(pBoot->rchild,pDC);
mPt.y = (lPt.y + rPt.y) / 2;
mPt.x = (pBoot->id - 21) * 45 + 60;
pDC->MoveTo(lPt);
pDC->LineTo(mPt.x,lPt.y);
pDC->LineTo(mPt.x,rPt.y);
pDC->LineTo(rPt);
CString str;
str.Format("%.4f",pBoot->dis);
pDC->TextOut(mPt.x+1,mPt.y,str);
}
else
{
CString str;
str.Format("%d",pBoot->id+1);
pDC->TextOut(5,m_nPosY-8,str);
pDC->Ellipse(22,m_nPosY-4,30,m_nPosY+4);
mPt = CPoint(30,m_nPosY);
m_nPosY += 30;
}
return mPt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -