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; }
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; };