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

📄 rprc.cpp

📁 使用BDA实现三维模型相关反馈的算法 注:算法使用的三维模型特征向量是从PSB模型库中自动提取的DESIRE三维模型特征向量
💻 CPP
字号:
#include "StdAfx.h"
#include ".\rprc.h"

extern struct labelsample labelvector[907];
extern int trainmatrix[90][907];
extern int trainclassnum[90];
extern int coarse1matrix[42][907];
extern int coarse1classnum[42];
extern int coarse2matrix[7][907];
extern int coarse2classnum[7];
extern int coarse3matrix[2][907];
extern int coarse3classnum[2];
extern double originfeaturematrix[907][FEATURELENGTH];
extern double distancematrix[907][907];
extern double distancevector[907];
extern struct userfeed userfeedvector[907];
extern int feednum;
extern int nearestobjects[FEADBACKNUM];
extern double tempvector[907];
extern int round;


Crprc::Crprc(void)
{
	outfile1.open("result1.txt");
	outfile2.open("result2.txt");
	outfile3.open("result3.txt");
}

Crprc::~Crprc(void)
{
	outfile1.close();
	outfile2.close();
	outfile3.close();
}

void Crprc::readlabels(CString infilepath)
{
	using namespace std;
	ifstream listfile(infilepath);
	string tempstr;
	CString ctempstr;
	int postion = 0;
	int objectlabel = 0;
	int trainclass = 0;
	int coarse1class = 0;
	int coarse2class = 0;
	int coarse3class = 0;

    int i;
	for (i=0;i<90;i++)
	{
		trainclassnum[i] = 0;

	}
	for (i=0;i<42;i++)
	{
		coarse1classnum[i] = 0;
	}
	for (i=0;i<7;i++)
	{
		coarse2classnum[i]=0;
	}
	for (i=0;i<2;i++)
	{
		coarse3classnum[i] = 0;
	}


	while (getline(listfile,tempstr))
	{
		ctempstr = tempstr.c_str();

		postion = ctempstr.Find(" ");
		//objectlabel = atoi(ctempstr.Left(postion));
		ctempstr.Delete(0,postion+1);

        postion = ctempstr.Find(" ");
		trainclass = atoi(ctempstr.Left(postion));
		trainmatrix[trainclass][trainclassnum[trainclass]] = objectlabel;
		trainclassnum[trainclass]++;
		ctempstr.Delete(0,postion+1);

		postion = ctempstr.Find(" ");
		coarse1class = atoi(ctempstr.Left(postion));
		coarse1matrix[coarse1class][coarse1classnum[coarse1class]] = objectlabel;
		coarse1classnum[coarse1class]++;
		ctempstr.Delete(0,postion+1);

		postion = ctempstr.Find(" ");
		coarse2class = atoi(ctempstr.Left(postion));
		coarse2matrix[coarse2class][coarse2classnum[coarse2class]] = objectlabel;
		coarse2classnum[coarse2class]++;
		ctempstr.Delete(0,postion+1);

		//postion = ctempstr.Find(" ");
		coarse3class = atoi(ctempstr);
		coarse3matrix[coarse3class][coarse3classnum[coarse3class]] = objectlabel;
		coarse3classnum[coarse3class]++;

        labelvector[objectlabel].train = trainclass;
		labelvector[objectlabel].coarse1 = coarse1class;
		labelvector[objectlabel].coarse2 = coarse2class;
		labelvector[objectlabel].coarse3 = coarse3class;



		objectlabel++;

	}
	listfile.close();



}

void Crprc::readfeatures(CString infilepath)
{
	using namespace std;
	ifstream listfile(infilepath);
	string tempstr;
	CString Ctempstr,tfeature;
	int serial,pos,i;
	for(serial=0;serial<907;serial++)
	{
		getline(listfile,tempstr);
		Ctempstr = tempstr.c_str();
		for (i = 0; i < FEATURELENGTH; i++)
		{
			pos = Ctempstr.Find(" ");
			tfeature = Ctempstr.Left(pos);
			originfeaturematrix[serial][i] = atof(tfeature);
			Ctempstr.Delete(0,pos+1);

		}

	}
	listfile.close();


	int j,k;
	double sum;
	for (i=0;i<907;i++)
	{
		for (j=0;j<907;j++)
		{
			sum=0;
			for (k=0;k<FEATURELENGTH;k++)
			{
				sum += (originfeaturematrix[i][k] - originfeaturematrix[j][k]) * (originfeaturematrix[i][k] - originfeaturematrix[j][k]);

			}
			distancematrix[i][j] = sum;
		}
	}

}

void Crprc::firstcomputedistance(int objectnum)
{
	int i;
	for (i=0;i<907;i++)
	{
		distancevector[i] = distancematrix[objectnum][i];
	}

}

void Crprc::userlabelfeedback(int objectnum)
{
	int i,j;
	int tempmin = 0;
	double tempdistance;
	for (i=0;i<FEADBACKNUM;i++)
	{
		tempdistance = DOUBLEMAX;
		for (j=0;j<907;j++)
		{
			if (distancevector[j] < tempdistance)
			{
				tempdistance = distancevector[j];
				tempmin = j;
			}

		}
		distancevector[tempmin] = DOUBLEMAX;
		nearestobjects[i] = tempmin;

	}

	//判断是否被标注过
	if (feednum>0)
	{
		for (i=0;i<FEADBACKNUM;i++)
		{
			for (j=0;j<feednum;j++)
			{
				if(nearestobjects[i] == userfeedvector[j].label)break;
			}
			if(j<feednum)nearestobjects[i]=-1;
		}

	}

	//未标注的继续标注
	int classnum;
	for (j=0;j<FEADBACKNUM;j++)
	{
		if(nearestobjects[j]>=0)
		{
			//真正的标注过程开始了
			classnum = labelvector[objectnum].train;
			for (i=0;i<trainclassnum[classnum];i++)
			{
				if(nearestobjects[j] == trainmatrix[classnum][i])break;

			}
			if (i<trainclassnum[classnum])
			{
				userfeedvector[feednum].label = nearestobjects[j];
				userfeedvector[feednum].value = PPPP;
				feednum++;
			}
			else//没找到
			{
				classnum = labelvector[objectnum].coarse1;
				for (i=0;i<coarse1classnum[classnum];i++)
				{
					if(nearestobjects[j] == coarse1matrix[classnum][i])break;
				}
				if (i<coarse1classnum[classnum])
				{
					userfeedvector[feednum].label = nearestobjects[j];
					userfeedvector[feednum].value = PPP;
					feednum++;
				}
				else//又没找到
				{
					classnum = labelvector[objectnum].coarse2;
					for (i=0;i<coarse2classnum[classnum];i++)
					{
						if(nearestobjects[j] == coarse2matrix[classnum][i])break;
					}
					if (i<coarse2classnum[classnum])
					{
						userfeedvector[feednum].label = nearestobjects[j];
						userfeedvector[feednum].value = PP;
						feednum++;
					}
					else//又又没找到
					{

						classnum = labelvector[objectnum].coarse3;
						for (i=0;i<coarse3classnum[classnum];i++)
						{
							if(nearestobjects[j] == coarse3matrix[classnum][i])break;
						}
						if (i<coarse3classnum[classnum])
						{
							userfeedvector[feednum].label = nearestobjects[j];
							userfeedvector[feednum].value = MM;
							feednum++;
						}
						else//不行了,放弃吧
						{
							userfeedvector[feednum].label = nearestobjects[j];
							userfeedvector[feednum].value = NN;
							feednum++;

						}

					}


				}

			}

		}
	}


}

void Crprc::newcomputedistance(int objectnum)
{
	using namespace std;
	int i,j;
	double sum;
	for (i=0;i<907;i++)
	{
		sum = 0;
		for (j=0;j<feednum;j++)
		{
			sum += userfeedvector[j].value * exp(-CEI*distancematrix[i][userfeedvector[j].label]);

		}
		sum = sum * GAMMA;

		for (j=0;j<FEATURELENGTH;j++)
		{
			tempvector[j] = originfeaturematrix[objectnum][j] - originfeaturematrix[i][j];
		}

		for (j=0;j<FEATURELENGTH;j++)
		{
			tempvector[j] = tempvector[j] - sum*tempvector[j];
		}

		sum = 0;
		for (j=0;j<FEATURELENGTH;j++)
		{
			sum += tempvector[j]*tempvector[j];
		}

		distancevector[i] = sum;

		if (round==0)
		{
			outfile1<<sum<<endl;
		}
		else if (round==1)
		{
			outfile2<<sum<<endl;
		}
		else if (round==2)
		{
			outfile3<<sum<<endl;
		}

	}

}

⌨️ 快捷键说明

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