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