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

📄 tools.cpp

📁 模糊K近邻分类器
💻 CPP
字号:
//该函数实现本程序中一些常用的工具函数

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <time.h>
#include "FuzzyNN.h"

//检测内存分配是否成功
void mcheck(int *p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(double *p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(ProtoNode *p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(ExemNode *p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(int **p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(double **p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(ProtoNode **p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(ExemNode **p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(FuzzyNum *p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
void mcheck(FuzzyNum **p)
{
	if(p==NULL)
	{
		cout<<"空间分配失败"<<endl;
		exit(1);
	}
}
//计算一个梯形模糊集的中心
double coa(FuzzyNum w)
{
	return ((w.w1+w.w2)/2+(w.b-w.a)/4);
}

//计算一个梯形模糊集的长度
double len(FuzzyNum w)
{
	return ((w.w2-w.w1)+(w.a+w.b)/2);
}

//计算一个exemplar结点的大小
double size(ExemNode E,int L)
{
	double s=0;
	int i;
	for(i=1;i<=L;i++)
		s+=len((E.v)[i]);
	return s/L;
}

//产生给定范围的随机数
double frand(double low,double high)
{
	srand((unsigned)time(NULL)); 
	return ((high-low)*rand()/RAND_MAX+low);
}

//产生给定范围的随机序列
void myrand(int num,int *seq,int low,int high)
{
	int *flag;
	flag=new int[high-low+1];
	mcheck(flag);
    int i;
	for(i=0;i<=high-low;i++)
		flag[i]=0;
	srand((unsigned)time(NULL));
	int count=0;
	int temp;
	while(count<num)
	{
		temp=(rand())%(high-low)+low;
		if(flag[temp-low]==0)
		{
			count++;
			seq[count]=temp;
			flag[temp-low]=1;
		}
	}
	delete []flag;
}
int vrand(int low,int high)
{
	srand((unsigned)time(NULL));
	return ((rand())%(high-low)+low);
}
void myrand(int num,int *seq)
{
	int *internal;
	internal=new int[num+1];
	mcheck(internal);

	int i;
	int temp;
	int index;
	for(i=1;i<=num;i++)
		internal[i]=i;
	for(i=num;i>=2;i--)
	{
		index=vrand(1,i);
		temp=internal[index];
		internal[index]=internal[i];
		internal[i]=temp;
	}
	for(i=1;i<=num;i++)
		seq[i]=internal[num+1-i];
	delete []internal;
}

//计算一个数组的和
int sum(int *a,int n)
{
	int i;
	int s=0;
	for(i=1;i<=n;i++)
		s+=a[i];
	return s;
}
//下面这个函数是为了测试的方便而写的
void WeightOut(ProtoNode *prototype,int N,int L)
{
	int i,j;
	for(j=1;j<=N;j++)
	{
		cout<<"第"<<j<<"个prototype结点的权值:"<<endl;
		for(i=1;i<=L;i++)
		{
			cout<<"W["<<i<<"]"<<"["<<j<<"]=(";
			cout<<(prototype[j].w)[i].w1<<",";
			cout<<(prototype[j].w)[i].w2<<",";
			cout<<(prototype[j].w)[i].a<<",";
			cout<<(prototype[j].w)[i].b<<")";
			cout<<"LR"<<endl;
		}
		cout<<"------------------------------------"<<endl;
	}
}

⌨️ 快捷键说明

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