⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 array.cpp

📁 此为地球物理中的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  }
  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 + -