zssfrequencyscaler.cpp

来自「某个实验事编写粗糙集智能信息处理的程序」· C++ 代码 · 共 144 行

CPP
144
字号
// ZssFrequencyScaler.cpp: implementation of the CZssFrequencyScaler class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ZssFrequencyScaler.h"
#include "../SetArgumentDlg3.h"


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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CZssFrequencyScaler::CZssFrequencyScaler()
{

}

CZssFrequencyScaler::~CZssFrequencyScaler()
{

}

/*-------------等频率划分离散化算法
输入参数    strfilesour:源文件名
----------- strfiledest:离散化结果保存文件名
没有对决策属性进行离散化*/
BOOL CZssFrequencyScaler::EqualFrequencyScaler(CString strfilesour, CString strfiledest)
{
	FILE *file_source,*file_dest;
	fpos_t file_pos;
	CWordArray array_k;//存放用户指定的参数
	int size,size1;
	CStringArray *ptagstring= NULL;
	CArray<float, float> * ptagnonstring= NULL;
	if ((file_pos=ReadFileHead((LPCTSTR)(strfilesour),1))==0)//读取文件头
		return FALSE;//失败返回
	if ((file_source=fopen(strfilesour,"r"))==NULL)
		return FALSE;
	if ((file_dest=fopen(strfiledest,"w"))==NULL)
		return FALSE;
	array_k.SetSize(m_iConAttrNum);
	
	//用户设置参数
	CSetArgumentDlg dlg(m_AttrName,m_AttrType,array_k,"等频率离散化",NULL);
	if(dlg.DoModal()!=IDOK)
		return FALSE;

	//统计属性为字符串的个数
	GetStrAndNonStrNum(size,size1);
	//分配空间
	if ((ptagstring=new CStringArray[size+1])== NULL)
			return FALSE;
	if ((ptagnonstring= new CArray<float,float>[size1+1])== NULL)
		{
			delete []ptagstring;
			return FALSE;
		}
	int i_Str_Attr_Index=0, i_Nonstr_Attr_Index=0;
	for (int i=0; i<m_iConAttrNum; i++)
	{
		if (0==stricmp(m_AttrType[i], "String"))//对字符串条件属性的处理
		{
			//扫描整个字符串属性,初始化ptagstring
			GetBreakPoint_InStrAttr(file_source, i, ptagstring[i_Str_Attr_Index], file_pos);
            i_Str_Attr_Index++;
		}
		else//非字符串属性的处理
		{			
			GetIntervalInFrequency(file_source,file_pos,i,
				array_k[i],ptagnonstring[i_Nonstr_Attr_Index]);
			i_Nonstr_Attr_Index++;
		}
	}
	
	WriteFileHead(file_dest,1,2);//把离散化的结果写入文件
	WriteResult(file_dest,file_source, file_pos, ptagnonstring, ptagstring);//写文件结尾
    WriteFileTail(file_dest,ptagnonstring, ptagstring);
	//释放空间*/
	fclose(file_source);
	fclose(file_dest);
	if (ptagstring!= NULL)
		delete []ptagstring;
	if (ptagnonstring!= NULL)
		delete []ptagnonstring;	
	return TRUE;
}

/* 在等频率离散化算法中取得每一个条件属性的断点间隔和最小属性值
输入参数          fp:文件指针
---------------   file_pos:文件位置(数据区的位置)
				  i_attrnum:第几个属性
				  i_k:划分区间数目(用户指定的参数)
---------------   tagnonstring:保存断点的数组*/
void  CZssFrequencyScaler::GetIntervalInFrequency(FILE *fp,fpos_t &file_pos,
	int i_attrnum, int i_k,CArray<float,float> &tagnonstring)
{
	float f_temp;
	char str_temp[ZSSLEN];
	CArray<float ,float> f_array;
	fsetpos(fp, &file_pos);
	MoveFilePoint(fp,i_attrnum);
	f_array.RemoveAll();
	for (long j=0; j<m_iRecordNum; j++)
	{
	    fscanf(fp,"%s",str_temp);
	    f_temp=atof(str_temp);
	//	fscanf(fp,"%f", &f_temp);
		AddToArrayByOrder(f_temp,f_array);//加入到数组
		MoveFilePoint(fp, m_iConAttrNum);
	}
	SetArrayByList(tagnonstring, f_array, i_k);
}

//设置断点
void CZssFrequencyScaler::SetArrayByList(CArray<float, float>&array,
										  CArray<float, float> &f_array, int i_k)
{
	int i_count=f_array.GetSize(), i_left, i_interval,i_pos;
	float f_temp;
	array.RemoveAll();
	if (i_k<2)//i_k为用户设置的断点区间数目,i_count为属性值的个数
		return;
	i_k=i_k>i_count?i_count:i_k;//如果断点区间数目大于相异属性值的个数
	//此时就将断点区间数缩为属性值的个数;否则不变
	array.SetSize(i_k-1);//设置断点集合,应为断点区间数目减一
	i_interval= i_count/i_k;//得到断点间隔
	i_left= i_count%i_k;
	i_pos=0;
	for (int i=0; i< i_k-1; i++)
	{
		i_pos+=i_interval;
		if (i<i_left)//实现区间增量,对i_left不为零时的处理。使属性值小的区间合并
			i_pos++;
		f_temp=(f_array[i_pos-1]+f_array[i_pos])/2;//断点取在相邻属性值之间
		array.SetAt(i,f_temp);//设置断点
	}
}

⌨️ 快捷键说明

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