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