ccluster.cpp

来自「LCL分群法 改善cure kmean.......等」· C++ 代码 · 共 95 行

CPP
95
字号
#include "stdafx.h"
#include "CCluster.h"
#include "CRecord.h"
#include "float.h"
#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CCluster::CCluster()
{
	mfRatio = 1.0f;
}

CCluster::CCluster(const char *label)
{
	moLabel = label;
	mfRatio = 1.0f;
}

CCluster::~CCluster()
{
	moRecordArray.RemoveAll();
}

BOOL CCluster::add_record(CRecord *record)
{
	record->set_cluster(this);
	moRecordArray.Add(record);
	return TRUE;
}

float CCluster::get_max_linkage()
{
	if(moRecordArray.GetSize() == 1) {return mfRadius;}

	float max = 0.0f;
	for(long i=0;i<moRecordArray.GetSize();i++){
		CRecord *r = (CRecord *)moRecordArray[i];
		float min = FLT_MAX;
		for(long j=0;j<moRecordArray.GetSize();j++){
			CRecord *s = (CRecord *)moRecordArray[j];
			if(r == s) {continue;}
			float dis = r->euclidean_distance(s);
			if(min > dis){
				min = dis;
			}
		}
		if(max < min){
			max = min;
		}
	}
	max = sqrt(max);
	return max;
}

float CCluster::cal_within_cluster_distance_by_NND()
{
	if(moRecordArray.GetSize() == 0) {return 0.0f;}
	float distance = 0.0f;
	for(long i=0;i<moRecordArray.GetSize();i++){
		CRecord *r = (CRecord *)moRecordArray[i];
		float min = FLT_MAX;
		for(long j=0;j<moRecordArray.GetSize();j++){
			CRecord *s = (CRecord *)moRecordArray[j];
			if(r == s) {continue;}
			float dis = r->euclidean_distance(s);
			if(min > dis){
				min = dis;
			}
		}
		distance += sqrt(min);
	}
	return distance/moRecordArray.GetSize();
}

float CCluster::cal_between_clusters_distance_by_single_linkage(CCluster *that)
{
	if(moRecordArray.GetSize() == 0) {return 0.0f;}
	float min = FLT_MAX;
	for(long i=0;i<moRecordArray.GetSize();i++){
		CRecord *r = (CRecord *)moRecordArray[i];
		for(long j=0;j<that->moRecordArray.GetSize();j++){
			CRecord *s = (CRecord *)that->moRecordArray[j];
			float dis = r->euclidean_distance(s);
			if(min > dis){
				min = dis;
			}
		}
	}
	return sqrt(min);
}

⌨️ 快捷键说明

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