📄 rprc.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 + -