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

📄 processcontrol.cpp

📁 使用BDA实现三维模型相关反馈的算法 注:1、使用本系统必须在本地计算机上安装matlab 2、算法使用的三维模型特征向量是从PSB模型库中自动提取的DESIRE三维模型特征向量 3、本系统自带
💻 CPP
字号:
#include "StdAfx.h"
#include ".\processcontrol.h"

extern int allclassobjectmembers[MAXCLASSNUM][MAXOBJECTNUM];
extern int numofoneclass[MAXCLASSNUM];
extern double originfeaturesmatrix[OBJECTNUMBER][FEATHERLENTH];
extern double distancetrans[OBJECTNUMBER];
extern int positiveobjects[OBJECTNUMBER];
extern int negativeobjects[OBJECTNUMBER];
extern int pandnobjects[OBJECTNUMBER];
extern int pandnnum;
extern int positivenum;
extern int negativenum;
extern int round;
extern int nearestobjects[RETURNBACKNUM];
//extern double trans[MAXCLASSNUM][FEATHERLENTH];
extern double ** trans;
extern double * transcut;
extern double newfeaturesmatrix[OBJECTNUMBER][FEATHERLENTH];
//extern double ** newfeaturesmatrix;

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

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

void CProcessControl::readalllabelsfromfile(CString infilepath)
{
	using namespace std;
	ifstream listfile(infilepath);
	string tempstr;
	CString ctempstr;
	int serial = 0;
	int classnum = 0;
	int postion = 0;

	getline(listfile,tempstr);
	while (getline(listfile,tempstr))
	{
		ctempstr = tempstr.c_str();
		if (ctempstr.Find(" ") > 0)
		{
			numofoneclass[classnum] = postion;
			classnum++;
			postion = 0;
			continue;
		}
		allclassobjectmembers[classnum][postion] = serial;
		postion++;
		serial++;

	}
	numofoneclass[classnum] = postion;
	listfile.close();


}

void CProcessControl::readallfeaturesfromfile(CString infilepath)
{
	using namespace std;
	ifstream listfile(infilepath);
	string tempstr;
	CString Ctempstr,tfeature;
	int serial,pos,i;
	for(serial=0;serial<OBJECTNUMBER;serial++)
	{
		getline(listfile,tempstr);
		Ctempstr = tempstr.c_str();
		for (i = 0; i < FEATHERLENTH; i++)
		{
			pos = Ctempstr.Find(" ");
			tfeature = Ctempstr.Left(pos);
			originfeaturesmatrix[serial][i] = atof(tfeature);
			Ctempstr.Delete(0,pos+1);

		}

	}
	listfile.close();


}

void CProcessControl::firstcomputedistance(int currentobject)
{
	using namespace std;
	int i,j;
	double distancetemp;
	for (i=0;i<OBJECTNUMBER;i++)
	{
		distancetemp = 0;
		for (j=0;j<FEATHERLENTH;j++)
		{
			distancetemp += (originfeaturesmatrix[i][j] - originfeaturesmatrix[currentobject][j])*(originfeaturesmatrix[i][j] - originfeaturesmatrix[currentobject][j]);
		}
		distancetrans[i] = distancetemp;
	}

}

void CProcessControl::labelretrieval(int currentclass)
{
	int i,j;
	int tempmin;
	double tempdistance;
	for (i=0;i<RETURNBACKNUM;i++)
	{
		tempdistance = DOUBLEMAX;
		for (j=0;j<OBJECTNUMBER;j++)
		{
			//if (distancetrans[j] < 0)continue;
			if (distancetrans[j] < tempdistance)
			{
				tempdistance = distancetrans[j];
				tempmin = j;
			}

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

	}

	for (i=0;i<RETURNBACKNUM;i++)
	{
		//判断是否被标注过
		for (j=0;j<pandnnum;j++)
		{
			if(pandnobjects[j] == nearestobjects[i])break;
		}
		if(j<pandnnum)continue;

		for (j=0;j<numofoneclass[currentclass];j++)
		{
			if (allclassobjectmembers[currentclass][j] == nearestobjects[i])break;

		}
		if (j<numofoneclass[currentclass])
		{
			positiveobjects[positivenum] = nearestobjects[i];
			positivenum++;
		}
		else
		{
			negativeobjects[negativenum] = nearestobjects[i];
			negativenum++;
		}
	}

	pandnnum = positivenum + negativenum;
	for (i=0;i<positivenum;i++)
	{
		pandnobjects[i] = positiveobjects[i];

	}
	j=0;
	for (;i<pandnnum;i++)
	{
		pandnobjects[i] = negativeobjects[j];
		j++;
	}


}

void CProcessControl::computenewfeaturematrix(void)
{
	int i,j,k;
	double sumtemp;
	for (i=0;i<OBJECTNUMBER;i++)
	{
		for (j=0;j<(int)(*transcut);j++)
		{
			sumtemp = 0;
			for (k=0;k<FEATHERLENTH;k++)
			{
				sumtemp += trans[j][k]*originfeaturesmatrix[i][k];

			}
			newfeaturesmatrix[i][j] = sumtemp;

		}
	}

	for (i=0;i<(int)(*transcut);i++)
	{
		delete[] trans[i];
	}
	delete[] trans;

}

void CProcessControl::newcomputedistance(int currentobject)
{
	using namespace std;
	int i,j;
	double distance;

	for (i=0;i<OBJECTNUMBER;i++)
	{
		distance = 0;
		for (j=0;j<(int)(*transcut);j++)
		{

			distance += (newfeaturesmatrix[i][j] - newfeaturesmatrix[currentobject][j])*(newfeaturesmatrix[i][j] - newfeaturesmatrix[currentobject][j]);

		}
		distancetrans[i] = distance;

		if (round == 0)
		{
			outfile1<<distance<<std::endl;
		}
		else if(round == 1)
		{
			outfile2<<distance<<std::endl;

		}
		else if(round == 2)
		{
			outfile3<<distance<<std::endl;

		}
	}

}

⌨️ 快捷键说明

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