📄 array.cpp
字号:
}
if(!bAscii)
{
Serialize(ar);
return true;
}
}
return false;
}
BOOL Array::SaveArray(CString strPath, BOOL bAscii)
{
CFile file(strPath,CFile::modeCreate|CFile::modeReadWrite);
CArchive ar(&file,CArchive::store);
if(bAscii)
{
int i,j;
CString s;
CString s1;
for(i=0;i<=nRow-1;i++)
{
s="";
for(j=0;j<=nCol-1;j++)
{
s1.Format("%.8lf ", pValue[i][j]);
s=s+s1;
}
ar.WriteString(s);
ar.WriteString("\r\n");//回车换行符号;
}
return true;
}
else
{
Serialize(ar);
return true;
}
return false;
}
BOOL Array::LoadArray(CString strPath)
{
CFile file(strPath,CFile::modeRead);
CArchive ar(&file,CArchive::load);
Serialize(ar);
return true;
}
BOOL Array::LoadArray()
{
static char BASED_CODE szFilter[] = "二进制文件(*.txt)|*.txt|Ascii 文件(*.dat)|*.dat|";
CFileDialog dlg(true,NULL,"2进制数据文件.txt",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal()==IDOK)
{
/* CString str=dlg.GetPathName(),f;
// CFile file(str,CFile::modeRead);
FILE *fp = NULL;
fp = fopen(str, "r");
fscanf(fp, "%d %d\n", &nRow, &nCol);
SetSize(nRow,nCol);
for(int i=0;i<nRow;i++)
{
for(int j=0;j<nCol;j++)
{
fscanf(fp,"%.8lf ", &pValue[i][j]);
}
fscanf(fp,"\r\n", &f);
}
return true;
*/
CString str=dlg.GetPathName();
CFile file(str,CFile::modeRead);
CArchive ar(&file,CArchive::load);
Serialize(ar);
return true;
}
return false;
}
void Array::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
{
ar<<nRow<<nCol;
for(int i=0;i<nRow;i++)
{
for(int j=0;j<nCol;j++)
{
ar<<pValue[i][j];
}
}
}
else
{
int row,col;
ar>>row>>col;
int l=row;
int j=col;
SetSize(row,col);
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
ar>>pValue[i][j];
}
}
}
}
void Array::Kjunzhi(float dis)
{
if(nRow==0)return;
int *Density,i,j,k;//储存每一点的初始密度
double SumDis=0.0;
Density=new int[nRow];
for(i=0;i<nRow;i++)
Density[i]=0;
for(i=0;i<nRow;i++)
{
for(j=0;j<nRow;j++)
//if(j!=i)//确保不是自己属于自己
// {
//double SumDis=0.0;
for(k=0;k<nCol;k++)
SumDis+=sqrt((pValue[j][k]-pValue[i][k])*(pValue[j][k]-pValue[i][k]));//得出两个类之间的欧氏距离
// SumDis=sqrt((pValue[j][0]-pValue[i][0])*(pValue[j][0]-pValue[i][0])
// +(pValue[j][1]-pValue[i][1])*(pValue[j][1]-pValue[i][1]));
SumDis/=37.8;
if(SumDis<dis)
Density[i]+=1;
//}
}
// for(i=0;i<nRow;i++)
// int h=Density[i];//测试用
int MaxDensity=-1,tag;
for(i=0;i<nRow;i++)
{
if(MaxDensity<Density[i])
{
MaxDensity=Density[i];//测试用
tag=i;
// Density[i]=-1;
}
}
Density[tag]=-1;
// Center pCenter[100];//初始化聚类中心
//int TotleCenter=1;
// p=new Center[10];
pCenter[0].Index=0;
pCenter[0].Axis=CPoint((int)pValue[tag][0],(int)pValue[tag][1]);//初始化聚类中心
int tol=0;
pCenter[0].member=new int[1];//初始化
for(j=0;j<nRow;j++)
{
SumDis=0.0;//距离初始化为0
//if(j!=tag)
// {
// for(k=0;k<nCol;k++)
// {
SumDis=sqrt((pValue[j][0]-pValue[tag][0])*(pValue[j][0]-pValue[tag][0])+
(pValue[j][1]-pValue[tag][1])*(pValue[j][1]-pValue[tag][1]));//得出两个类之间的欧氏距离
SumDis/=37.8;
//}
if(SumDis<dis)
{
pCenter[0].member=(int*)realloc(pCenter[0].member,sizeof(int)*(++tol));//重新分配空间
//p[0].member=new int[k];
pCenter[0].member[tol-1]=j;
pCenter[0].Tol=tol;
Density[j]=-1;
}
// }
}
for(i=0;i<nRow;i++)
{
if(Density[i]==1)
{
TotleCenter+=1;
tol=0;
pCenter[TotleCenter-1].member=new int[1];
pCenter[TotleCenter-1].Index=TotleCenter-1;
pCenter[TotleCenter-1].Axis= CPoint((int)pValue[i][0],(int)pValue[i][1]);
pCenter[TotleCenter-1].member=(int*)realloc(pCenter[TotleCenter-1].member,sizeof(int)*(++tol));//重新分配空间
//p[0].member=new int[k];
pCenter[TotleCenter-1].member[tol-1]=i;
pCenter[TotleCenter-1].Tol=tol;
Density[i]=-1;
}
}
///////////////////////////////////
Loop1:
MaxDensity=-1;
for(i=0;i<nRow;i++)
{
if(MaxDensity<Density[i])
{
MaxDensity=Density[i];
tag=i;
}
}
SumDis=0.0;
//for(int k=0;k<nCol;k++)
//{
//pCenter[0].Axis.x
Density[tag]=-1;
for(i=0;i<TotleCenter;i++)
{
SumDis=sqrt((pCenter[i].Axis.x-pValue[tag][0])*(pCenter[i].Axis.x-pValue[tag][0])
+(pCenter[i].Axis.y-pValue[tag][1])*(pCenter[i].Axis.y-pValue[tag][1]));//得出两个类之间的欧氏距离
SumDis/=37.8;
//if(SumDis<2*dis&&Density[tag]!=1)
if(SumDis<2*dis)
{
// Density[tag]=-1;
break;
}
}
if(i==TotleCenter)
{
TotleCenter+=1;
pCenter[TotleCenter-1].Index=TotleCenter-1;
pCenter[TotleCenter-1].Axis= CPoint((int)pValue[tag][0],(int)pValue[tag][1]);
SumDis=0.0;//距离初始化为0
tol=0;
pCenter[TotleCenter-1].member=new int[1];
for(j=0;j<nRow;j++)
{
// if(j!=tag)
//{
//SumDis+=sqrt((pValue[j][0]-pValue[tag][0])*(pValue[j][1]-pValue[tag][1]));//得出两个类之间的欧氏距离
SumDis=sqrt((pValue[j][0]-pValue[tag][0])*(pValue[j][0]-pValue[tag][0])
+(pValue[j][1]-pValue[tag][1])*(pValue[j][1]-pValue[tag][1]));//得出两个类之间的欧氏距离
SumDis/=37.8;
if(SumDis<dis)
{
pCenter[TotleCenter-1].member=(int*)realloc(pCenter[TotleCenter-1].member,sizeof(int)*(++tol));//重新分配空间
//p[0].member=new int[k];
pCenter[TotleCenter-1].member[tol-1]=j;
pCenter[TotleCenter-1].Tol=tol;
Density[j]=-1;
}
// }
}
}
for(i=0;i<nRow;i++)
{
if(Density[i]!=-1)
goto Loop1;
}
CString str;
str.Format("%d",TotleCenter);
AfxMessageBox(str);
//MessageBox("hi");
///////////////////////////////////////////////////////////
Loop2: if(TotleCenter-1)//如果点的个数不为一
{
for(i=0;i<TotleCenter;i++)
{
double Sumx=0.,Sumy=0.;
for(int j=0;j<pCenter[i].Tol;j++)
{
Sumx+=g_Array(pCenter[i].member[j],0);
Sumy+=g_Array(pCenter[i].member[j],1);
}
// Sumx;
// Sumy;
//pCenter[i].Tol;
pCenter[i].Axis.x=(int)Sumx/pCenter[i].Tol;
pCenter[i].Axis.y=(int)Sumy/pCenter[i].Tol;
pCenter[i].Tol=0;
delete pCenter[i].member;
pCenter[i].member=new int[1];
SumDis=0.0;tol=0;
for(j=0;j<nRow;j++)
{
SumDis=sqrt((pValue[j][0]-pCenter[i].Axis.x)*(pValue[j][0]-pCenter[i].Axis.x)
+(pValue[j][1]-pCenter[i].Axis.y)*(pValue[j][1]-pCenter[i].Axis.y));//得出两个类之间的欧氏距离
SumDis/=37.8;
if(SumDis<dis)
{
pCenter[i].member=(int*)realloc(pCenter[i].member,sizeof(int)*(++tol));//重新分配空间
//p[0].member=new int[k];
pCenter[i].member[tol-1]=j;
pCenter[i].Tol=tol;
// char buf[1024];
// sprintf(buf, "%d属于第%d类,%d个点 ;", pCenter[i].member[tol-1],
// i,pCenter[i].Tol);
//OutputDebugString(buf);//测试用
}
}
}
}
double Sumx=0.0,Sumy=0.0;
for(i=0;i<TotleCenter;i++)
{
int b=pCenter[i].Tol;
for(j=0;j<pCenter[i].Tol;j++)
{
Sumx+=g_Array(pCenter[i].member[j],0);
Sumy+=g_Array(pCenter[i].member[j],1);
}
if( pCenter[i].Axis.x-(int)Sumx/pCenter[i].Tol>1||
pCenter[i].Axis.y-(int)Sumy/pCenter[i].Tol>1)
goto Loop2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -