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

📄 cmatrix.cpp

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

extern double originfeaturesmatrix[OBJECTNUMBER][FEATHERLENTH];
extern double newfeaturesmatrix[OBJECTNUMBER][MAXCLASSNUM];
extern int allclassobjectmembers[MAXCLASSNUM][MAXOBJECTNUM];
extern int numofoneclass[MAXCLASSNUM];
extern int positiveobjects[OBJECTNUMBER];
extern int negativeobjects[OBJECTNUMBER];
extern int pandnobjects[OBJECTNUMBER];
extern int pandnnum;
extern int positivenum;
extern int negativenum;
extern double trans[MAXCLASSNUM][FEATHERLENTH];
//extern double Sb[FEATHERLENTH][FEATHERLENTH];
//extern double Sw[FEATHERLENTH][FEATHERLENTH];
//extern double trans[MAXCLASSNUM][FEATHERLENTH];
//double mx[FEATHERLENTH];
extern double tempfeature[FEATHERLENTH];
extern double tempmatrix[FEATHERLENTH][FEATHERLENTH];
extern double tempsb[FEATHERLENTH*FEATHERLENTH];
extern double tempsw[FEATHERLENTH*FEATHERLENTH];
extern double * temptrans;
extern double Sb[FEATHERLENTH][FEATHERLENTH];
extern double Sw[FEATHERLENTH][FEATHERLENTH];
extern double mx[FEATHERLENTH];
extern double my[FEATHERLENTH];
extern double mm[FEATHERLENTH];



CMatrix::CMatrix(void)
//: ep(NULL)
//, mx(NULL)
{
	//int i;
	ep = engOpen(NULL);
	//Sb =new double*[FEATHERLENTH];
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	Sb[i] = new double[FEATHERLENTH];
	//}
	//Sw = new double *[FEATHERLENTH];
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	Sw[i] = new double[FEATHERLENTH];
	//}
	//trans = new double *[90];
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	trans[i] = new double[FEATHERLENTH];
	//}

	//mx = new double[FEATHERLENTH];

	//tempfeature = new double[FEATHERLENTH];
	//tempmatrix = new double*[FEATHERLENTH];
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	tempmatrix[i] = new double[FEATHERLENTH];
	//}

	//tempsb = new double[FEATHERLENTH*FEATHERLENTH];
	//tempsw = new double[FEATHERLENTH*FEATHERLENTH];
	//temptrans = new double[90*FEATHERLENTH];

	arraysb = mxCreateDoubleMatrix(FEATHERLENTH,FEATHERLENTH,mxREAL);
	mxSetClassName(arraysb,"sb");
	arraysw = mxCreateDoubleMatrix(FEATHERLENTH,FEATHERLENTH,mxREAL);
	mxSetClassName(arraysw,"sw");


}

CMatrix::~CMatrix(void)
{
	engClose(ep);
	//delete[] Sb;
	//delete[] Sw;
	//delete[] mx;
	//delete[] tempmatrix;
	//delete[] tempfeature;
	//delete[] tempsb;
	//delete[] tempsw;
    //delete[] temptrans;
	mxDestroyArray(arraysb);
	mxDestroyArray(arraysw);
	//mxDestroyArray(arraytrans);
	//delete[] trans;
}

bool CMatrix::initvariables(void)
{
	int i,j;
	for (i=0;i<FEATHERLENTH;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			Sb[i][j] = 0;
		}
	}
	for (i=0;i<FEATHERLENTH;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			Sw[i][j] = 0;
		}
	}
	for (i=0;i<FEATHERLENTH;i++)
	{
		mx[i] = 0;
	}

	return true;
}

bool CMatrix::computemx()
{
	int i,j;
	double sumtemp;
	for (j=0;j<FEATHERLENTH;j++)
	{
		sumtemp = 0;
		for (i=0;i<positivenum;i++)
		{
             sumtemp += originfeaturesmatrix[positiveobjects[i]][j];

		}
		sumtemp = sumtemp/positivenum;
		mx[j] = sumtemp;

	}

	//std::ofstream tempfile("test.txt");
	//double tempi;
	//for (i= 0;i<FEATHERLENTH;i++)
	//{
		//double tempi = mx[299];
	//}


	return true;
}

bool CMatrix::computeSb()
{
	int i,j;

	//for (i=0;i<negativenum;i++)
	//{
	//	for (j=0;j<FEATHERLENTH;j++)
	//	{
	//		tempfeature[j] = originfeaturesmatrix[negativeobjects[i]][j] - mx[j];
	//	}
	//	featuremultiself(tempfeature,tempmatrix);
	//	summatrix(Sb,tempmatrix);
	//}

		for (j=0;j<FEATHERLENTH;j++)
		{
			tempfeature[j] = mx[j] - mm[j];
		}
		featuremultiself(tempfeature,tempmatrix);
		for (i=0;i<FEATHERLENTH;i++)
		{
			for (j=0;j<FEATHERLENTH;j++)
			{
				tempmatrix[i][j] *= positivenum;
			}
		}
		summatrix(Sb,tempmatrix);

		for (j=0;j<FEATHERLENTH;j++)
		{
			tempfeature[j] = my[j] - mm[j];
		}
		featuremultiself(tempfeature,tempmatrix);
		for (i=0;i<FEATHERLENTH;i++)
		{
			for (j=0;j<FEATHERLENTH;j++)
			{
				tempmatrix[i][j] *= negativenum;
			}
		}
		summatrix(Sb,tempmatrix);

	return true;
}

bool CMatrix::featuremultiself(double feature[FEATHERLENTH], double matrix[FEATHERLENTH][FEATHERLENTH])
{
	int i,j;
	for (i=0;i<FEATHERLENTH;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			//double tempi = feature[i];
			//double tempii = feature[j];
			matrix[i][j] = feature[i]*feature[j];
			//double tempiii = matrix[i][j];
		}
	}
	return true;
}

bool CMatrix::summatrix(double desmatrix[FEATHERLENTH][FEATHERLENTH], double tempmatrix[FEATHERLENTH][FEATHERLENTH])
{
	int i,j;
	for (i=0;i<FEATHERLENTH;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			desmatrix[i][j] += tempmatrix[i][j];
		}
	}

	return true;
}

bool CMatrix::computeSw()
{
	int i,j;

	for (i=0;i<positivenum;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			tempfeature[j] = originfeaturesmatrix[positiveobjects[i]][j] - mx[j];
		}
		featuremultiself(tempfeature,tempmatrix);
		summatrix(Sw,tempmatrix);
	}

	for (i=0;i<negativenum;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			tempfeature[j] = originfeaturesmatrix[negativeobjects[i]][j] - my[j];
		}
		featuremultiself(tempfeature,tempmatrix);
		summatrix(Sw,tempmatrix);
	}

	//double tempi = Sw[0][0];


	return true;
}

bool CMatrix::computetransformmatrix(void)
{
	int i,j;
	//转换sb和sw的输入矩阵
	for (i=0;i<FEATHERLENTH;i++)//列标号
	{
		for (j=0;j<FEATHERLENTH;j++)//行标号
		{
			tempsb[i*FEATHERLENTH + j]  = Sb[j][i];
		}
	}
	for (i=0;i<FEATHERLENTH;i++)
	{
		for (j=0;j<FEATHERLENTH;j++)
		{
			tempsw[i*FEATHERLENTH + j] = Sw[j][i];
		}
	}
	//std::ofstream tempfile("test.txt");
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	for (j=0;j<FEATHERLENTH;j++)
	//	{
	//		tempfile<<Sb[i][j]<<" ";
	//	}
	//	tempfile<<std::endl;
	//}
	//tempfile.close();

	memcpy((char*)mxGetPr(arraysb),(char*)tempsb,FEATHERLENTH*FEATHERLENTH*sizeof(double));
	memcpy((char*)mxGetPr(arraysw),(char*)tempsw,FEATHERLENTH*FEATHERLENTH*sizeof(double));
	engPutVariable(ep,"sb",arraysb);
	engPutVariable(ep,"sw",arraysw);

	//中间的计算步骤还需要进一步确实
	engEvalString(ep,"[v,d]=eig(sb,sw);");
	//engEvalString(ep,"for i=1:300;if d(i,i)>1000;d(i,i) = 1000;elseif d(i,i)<-1000;d(i,i)=-1000;end;end;");
	//////////////////////////////////////////////////////////////////////////
	//有极值,这是一个很大的问题
	//////////////////////////////////////////////////////////////////////////
	engEvalString(ep,"[l c]=size(d);for(i=1:90);temp=-inf;pos=1;for(j=1:c);if(d(j,j)~=nan);if(d(j,j)>=temp);temp=d(j,j);pos=j;end;end;end;if(d(pos,pos)<=0);trans(1:c,i)=0;elseif(d(pos,pos)>1000000);trans(1:c,i)=1000*v(1:c,pos);else;trans(1:c,i)=(d(pos,pos)^0.5)*v(1:c,pos);end;d(pos,pos)=nan;end;");

	engEvalString(ep,"trans = trans';");//有问题
	//engEvalString(ep,"trans = trans';");

 //   mxArray * arraytrans;

	//arraytrans = mxCreateDoubleMatrix(90,FEATHERLENTH,mxREAL);

	arraytrans = engGetVariable(ep,"trans");

	//double * temptrans;
	
	//temptrans = new double[90*FEATHERLENTH];

    temptrans = mxGetPr(arraytrans);

    //mxDestroyArray(arraytrans);

	//std::ofstream outfile("test.txt");
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	for (j=0;j<90;j++)
	//	{
	//		outfile<< temptrans[i*FEATHERLENTH + j]<<" ";
	//	}
	//	outfile<<std::endl;
	//}
 //   outfile.close();


    for (i=0;i<FEATHERLENTH;i++)
    {
		for (j=0;j<90;j++)
		{
            trans[j][i] = temptrans[i*FEATHERLENTH + j];
		}
    }


	mxDestroyArray(arraytrans);
	//delete[] temptrans;
	//std::ofstream tempfile1("test1.txt");
	//for (i=0;i<FEATHERLENTH;i++)
	//{
	//	for (j=0;j<FEATHERLENTH;j++)
	//	{
	//		tempfile1<<trans[i][j]<<" ";
	//	}
	//	tempfile1<<std::endl;
	//}
	//   tempfile1.close();

	//double tempi = trans[19][29];
   
	return true;
}


void CMatrix::computemy(void)
{
	int i,j;
	double sumtemp;
	for (j=0;j<FEATHERLENTH;j++)
	{
		sumtemp = 0;
		for (i=0;i<negativenum;i++)
		{
			sumtemp += originfeaturesmatrix[negativeobjects[i]][j];

		}
		sumtemp = sumtemp/negativenum;
		my[j] = sumtemp;

	}


}

void CMatrix::computemm(void)
{
	int i,j;
	double sumtemp;
	for (j=0;j<FEATHERLENTH;j++)
	{
		sumtemp = 0;
		for (i=0;i<pandnnum;i++)
		{
			sumtemp += originfeaturesmatrix[pandnobjects[i]][j];

		}
		sumtemp = sumtemp/pandnnum;
		mm[j] = sumtemp;

	}


}

⌨️ 快捷键说明

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