www.pudn.com > ISODATA.rar > ISODATAClassifier.cpp
// ISODATAClassifier.cpp: implementation of the CISODATAClassifier class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ISODATAClassifier.h"
#include "math.h"
#include "algorithm"
#include "resource.h"
#include "dlgisodataopt.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CISODATAClassifier::CISODATAClassifier()
{
m_pdSwatchData = NULL;
m_iPattDimen = 0;
m_iSwatchNum = 0;
}
CISODATAClassifier::~CISODATAClassifier()
{
delete []m_pdSwatchData;
}
int CISODATAClassifier::InitSwatchData(double* pSwatchData, int iSwatchNum, int iPattDimen)
{
m_iSwatchNum = iSwatchNum;
m_iPattDimen = iPattDimen;
if(m_pdSwatchData != NULL)
delete []m_pdSwatchData;
m_pdSwatchData = new double[iPattDimen*iSwatchNum];
memcpy(m_pdSwatchData, pSwatchData, sizeof(double)*iPattDimen*iSwatchNum);
return 1;
}
int CISODATAClassifier::ClassifyProcess()
{
if(NULL == m_pdSwatchData)
return 0;
CTypeClass FirClass(2);
//初始聚类中心
for(int i=0; i= m_ISODATAOpt.iDemaK*2 || n == m_ISODATAOpt.iIterMaxNum)
iChoice = 2;
else
iChoice = 1;
if(1 == iChoice)
{
//第九步:标准差计算
for(int i=0; i m_VETypeClass[i].m_iMaxVari)
m_VETypeClass[i].m_iMaxVari = j;
}
}
//第十步:
int iOriNum = m_VETypeClass.size();
int* pFlag = new int[iOriNum];
memset(pFlag, 0, sizeof(int));
for(i=0; i m_ISODATAOpt.dSigThres)
{
if( (m_VETypeClass[i].m_dSCDist > dMeanDis && m_VETypeClass[i].m_VESwatch.size() > 2*(m_ISODATAOpt.iClassMinNum+1)) ||
m_VETypeClass.size() <= m_ISODATAOpt.iDemaK/2)
{
CTypeClass ClassZAdd(2), ClassZMinu(2);
ClassZAdd = m_VETypeClass[i];
ClassZMinu = m_VETypeClass[i];
ClassZAdd.m_pdCenter[m_VETypeClass[i].m_iMaxVari] += m_VETypeClass[i].m_pdVariance[m_VETypeClass[i].m_iMaxVari]*m_ISODATAOpt.dSigInter;
ClassZMinu.m_pdCenter[m_VETypeClass[i].m_iMaxVari] -= m_VETypeClass[i].m_pdVariance[m_VETypeClass[i].m_iMaxVari]*m_ISODATAOpt.dSigInter;
//m_VETypeClass.erase(m_VETypeClass.begin()+i);
pFlag[i] = 1;
m_VETypeClass.push_back(ClassZAdd);
m_VETypeClass.push_back(ClassZMinu);
}
}
}
for(i=0; i VEMerge;
int iOriNum = m_VETypeClass.size();
int* pFlag = new int[iOriNum];
memset(pFlag, 0, sizeof(double));
//计算类间距离
for(int i=0; i m_ISODATAOpt.dCenThres)
{
MERGE Merge;
Merge.iFir = i;
Merge.iSec = j;
Merge.dDis = pDis;
VEMerge.push_back(Merge);
}
}
}
//类间距离排序
sort(VEMerge.begin(), VEMerge.end(), MergeCompare);
int iEnd = VEMerge.size();
if(iEnd > m_ISODATAOpt.iMergMaxNum)
iEnd = m_ISODATAOpt.iMergMaxNum;
for(i=0; i MergeR.dDis)
return FALSE;
return TRUE;
}
int CISODATAClassifier::ResultFile(char* strFile)
{
FILE* fp = fopen(strFile, "wt");
fprintf(fp, " 结果输出文件\n");
fprintf(fp, "//////////////////////////////////////////////////////////////////////////\n");
fprintf(fp, "// 作者: 学号 //\n");
fprintf(fp, "// 林立文 200432590138 //\n");
fprintf(fp, "// 研发单位:武汉大学遥感学院04023 //\n");
fprintf(fp, "// 版权所有 翻版必究 //\n");
fprintf(fp, "//////////////////////////////////////////////////////////////////////////\n\n");
fprintf(fp, " 文件基本信息\n\n");
fprintf(fp, "总样本数:%d 总分类数:%d\n", m_iSwatchNum, m_VETypeClass.size());
fprintf(fp, "///////////////////////////////////////////////////////\n");
for(int i=0; i VETypeClass, char* strFile)
{
FILE* fp = fopen(strFile, "wt");
fprintf(fp, "总样本数:%d 当前聚类数:%d\n", m_iSwatchNum, m_VETypeClass.size());
fprintf(fp, "///////////////////////////////////////////////////////\n");
for(int i=0; i