示例#1
0
Eigen::MatrixXd& Evrot::rotate_givens(Eigen::VectorXd& theta) {
	Eigen::MatrixXd& G = build_Uab(theta, 0, mNumAngles-1);
	Eigen::MatrixXd& Y = *new Eigen::MatrixXd(mX.rows(),mX.cols());
	Y = mX*G;
	delete &G;
	return Y;
}
示例#2
0
double Evrot::evqualitygrad(Eigen::VectorXd& theta, int angle_index) {
	// build V,U,A
	Eigen::MatrixXd& V = gradU(theta, angle_index);

	Eigen::MatrixXd& U1 = build_Uab(theta, 0,angle_index-1);
	Eigen::MatrixXd& U2 = build_Uab(theta, angle_index+1,mNumAngles-1);

	Eigen::MatrixXd A = mX*U1*V*U2;

	delete &V;
	delete &U1;
	delete &U2;

	// rotate vecs according to current angles
	Eigen::MatrixXd& Y = rotate_givens(theta);

	// find max of each row
	Eigen::VectorXd max_values(mNumData);
	Eigen::VectorXi max_index_col(mNumData);
	for (int i=0; i<mNumData; i++ ) {
		int row, col;
//		Y.row(i).cwise().abs().maxCoeff(&row, &col);
		Y.row(i).cwiseAbs().maxCoeff(&row, &col);
		max_values[i] = Y(i,col);
		max_index_col[i] = col;
	}

	// compute gradient
	double dJ=0, tmp1, tmp2;
	for( int j=0; j<mNumDims; j++ ){  // loop over all columns
		for( int i=0; i<mNumData; i++ ){ // loop over all rows
			tmp1 = A(i,j) * Y(i,j) / (max_values[i]*max_values[i]);
			tmp2 = A(i,max_index_col[i]) * (Y(i,j)*Y(i,j)) / (max_values[i]*max_values[i]*max_values[i]);
			dJ += tmp1-tmp2;
		}
	}
	dJ = 2*dJ/mNumData/mNumDims;
	if( DEBUG )
		std::cout << "Computed gradient = " << dJ << std::endl;

	delete &Y;

	return dJ;
}
void rotate_givens(double *X, double *theta, const int* ik, const int* jk, int angle_num,int row,int dim,double* ret)
{
	double* rot=new double[dim*dim];
	MatrixInitZeros(rot,dim,dim);
    build_Uab(theta, 0, angle_num-1,ik,jk,dim,rot);

    MatrixMultiMatrix(ret,X,rot,row,dim,dim,dim);

   	delete []rot;
};
double evqualitygrad(double *X, double* theta,const int *ik,const int *jk,int angle_num,int angle_index,int dim,int ndata)
{                   
    /* build V,U,A */
    double* matret=new double[dim*dim];
    double* U1=new double[dim*dim];
    double* U2=new double[dim*dim];
    double* A=new double[ndata*dim];
    double* matrot=new double[ndata*dim]; 
	double *max_values = new double[ndata];
    int *max_index = new int[ndata];
	double dJ=0, tmp1, tmp2;
	double* p_A;
	double *p_Y;
    /* find max of each row */
	MatrixInitZeros(matret,dim,dim);
	MatrixInitZeros(U1,dim,dim);
	MatrixInitZeros(U2,dim,dim);
	MatrixInitZeros(A,ndata,dim);
	MatrixInitZeros(matrot,ndata,dim);
	MatrixInitZeros(max_values,ndata,1);
	MatrixInitZeros(max_index,ndata,1);
    int i,j, ind = 0;
	
	//getchar();
    gradU(theta,angle_index,ik,jk,dim,matret);
    /**/

	//getchar();
    build_Uab(theta,0,angle_index-1,ik,jk,dim,U1);
	/**/

	/**/
    build_Uab(theta,angle_index+1,angle_num-1,ik,jk,dim,U2);


    buildA(X,U1,matret,U2,A,ndata,dim);
   
	
    /* rotate vecs according to current angles */   
    rotate_givens(X,theta,ik,jk,angle_num,ndata,dim,matrot);
	p_Y=matrot; 

	MaxRowColumnAbsValue(p_Y,max_values,max_index,ndata,dim,1);

    /* compute gradient */
    ind = 0;
	dJ=0;
	for( i=0; i<ndata; i++ )
	{ /* loop over all rows */
		p_A=(double*)(A+i*dim);
		p_Y=(double*)(matrot+i*dim);
		for( j=0; j<dim; j++ )
		{  /* loop over all columns */

            tmp1 = p_A[j] * p_Y[j] / (max_values[i]*max_values[i]);
            tmp2 = p_A[max_index[i]]*(p_Y[j]*p_Y[j])/(max_values[i]*max_values[i]*max_values[i]);
            dJ += tmp1-tmp2;
        }
    }
    dJ = 2*dJ/ndata/dim;
    delete []max_values;
    delete []max_index;
   	delete []matrot;
   	delete []matret;
   	delete []U2;
   	delete []U1;
    delete []A;
    return dJ;
};