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

📄 unit2.cpp

📁 模式识别中的聚类k均值算法用C++ builder编码实现是cpp文件
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm2::FormCreate(TObject *Sender)
{
    String InitDir=GetCurrentDir();
    dlgOpen1->InitialDir=InitDir;
    

}
//---------------------------------------------------------------------------

void __fastcall TForm2::btn1Click(TObject *Sender)
{
  lv1->Items->Clear();
  lv2->Items->Clear();
  lv3->Items->Clear();

  int SampleSN=0;//模式样本序号
  int iFileHandle,iFileLength,iBytesRead;
  char *PatternBuffer;
  if(dlgOpen1->Execute())
  {
    try
    {
      iFileHandle=FileOpen(dlgOpen1->FileName,fmOpenRead);
      iFileLength=FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      PatternBuffer=new char[iFileLength+1];
      iBytesRead=FileRead(iFileHandle,PatternBuffer,iFileLength);
      FileClose(iFileHandle);
      bool ReadFlag=false;  //数据加入与否标志
      AnsiString EData="";  //读入有效数据
      TListItem *p;
      int DataDim=0;  //样本的维
      for(int i=0;i<iBytesRead;i++)
      {
         if((PatternBuffer[i]>='0'&&PatternBuffer[i]<='9')||PatternBuffer[i]=='.')
            {ReadFlag=true;EData+=PatternBuffer[i];}
         else
            {
              if(ReadFlag)
                 {
                   if(DataDim==0)
                   {
                     if(SampleSN<50)
                     {
                       p=lv1->Items->Add();
                       p->Caption=EData;
                     }
                     if(SampleSN>=50&&SampleSN<100)
                     {
                       p=lv2->Items->Add();
                       p->Caption=EData;
                     }
                     if(SampleSN>=100&&SampleSN<150)
                     {
                       p=lv3->Items->Add();
                       p->Caption=EData;
                     }
                   }
                   else{
                        p->SubItems->Add(EData);
                        Pattern[SampleSN][DataDim-1]=atof(EData.c_str());
                        //PatternExpand[SampleSN][DataDim-1]=Pattern[SampleSN][DataDim-1];
                        }
                   //edt5->Text=FloatToStr(PatternExpand[1][4]);
                   EData="";
                   ReadFlag=false;
                   DataDim++;
                   if(DataDim==5)
                   {
                     //PatternExpand[SampleSN][4]=1;
                     DataDim=0;
                     SampleSN++;

                   }
                   
                 }
            }
      }

  delete[] PatternBuffer;
    }
    catch(...)
    {
      Application->MessageBox("不能进行以下文件操作:打开、寻找、读取和关闭。", "File Error", IDOK);
    }
  }

  /////////////////////////////////////////
  for(int i=0;i<150;i++)
	{
		for(int j=0;j<4;j++)
		{
			PatternOrder[i][j]=Pattern[i][j];
		}
	}

  //////////////////////////////////////////////////
  //排序
  float temp;
    for(int j=0;j<4;j++)
      {
        for(int i=0;i<150;i++)
          {
            for(int n=149;n>i;n--)
              {
                if(PatternOrder[i][j]>PatternOrder[n][j])
                  {
                    temp=PatternOrder[i][j];
                    PatternOrder[i][j]=PatternOrder[n][j];
                    PatternOrder[n][j]=temp;
                  }
              }
          }
      }
   ////////////////////排序完毕////////////////////////////////////////

   //////////////////////编号/////////////////////////////////////
   int zg,m;
	for(int j=0;j<4;j++)
	{
		m=0;
		for(int i=0;i<150;i=i+zg)
		{	
			zg=0;
			for(int n=0;n<150;n++)
			{	
				if(PatternOrder[i][j]==Pattern[n][j])
				{	
					bianhao[m][j]=n;
					zg++;
					m++;					
				}
			}

		}		
	}	

///////////////////////////////详细编号////////////////////////////
/////////////////////////////////////////////////////////////////
	
	float R[4][3];
	float sum;
	for(int j=0;j<4;j++)
	{
		sum=0;
	for(int i=0;i<150;i++)
	{
		if(bianhao[i][j]<50)
		{	
 			sum+=(i+1);
		}				
	}
	
	R[j][0]=sum/50;
///////////////////////////////////////////////////////////////////
	sum=0;
	for(int i=0;i<150;i++)
	{
		if(50<=bianhao[i][j]&&bianhao[i][j]<100)
		{	
			sum+=(i+1);
		}
	}

	R[j][1]=sum/50;
///////////////////////////////////////////////////////////////
	sum=0;
	for(int i=0;i<150;i++)
	{
		if(100<=bianhao[i][j]&&bianhao[i][j]<150)
		{		
			sum+=(i+1);
		}

	}
	R[j][2]=(float)sum/50;
	}

      float N=12.0*50/22650.0;
      for(int j=0;j<4;j++)
	  {
          H[j]=(R[j][0]-75.5)*(R[j][0]-75.5) +(R[j][1]-75.5)*(R[j][1]-75.5) +(R[j][2]-75.5)*(R[j][2]-75.5);
          H[j]=H[j]*N;
      }
      edt1->Text=FloatToStr(H[0]);
      edt2->Text=FloatToStr(H[1]);
      edt3->Text=FloatToStr(H[2]);
      edt4->Text=FloatToStr(H[3]);
      Application->MessageBox("由K-W检验理论可知H越大分类能力越强,\n"
          "所以特征X1,X3和X4特征分类能力较强!",
          "结果", MB_OK + MB_ICONINFORMATION);

}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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