📄 ccluster.cpp
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -