コード例 #1
0
float
CRebuildGraph::compareMatrix(gsl_matrix* matrixA, gsl_matrix*matrixB){

    
    float delta;
    gsl_vector *work ,*s;
    
    
    if (matrixA->size1 != matrixB->size1)
        throw runtime_error(" size 1 and size 2 are different");
    
    gsl_matrix *U1, *U2,*V1,*V2;
    
    InitMatrix((int)matrixA->size1,&work,&s,&U1,&U2,&V1,&V2);

    gsl_matrix_memcpy (U1, matrixA);
    //gsl_linalg_SV_decomp (gsl_matrix * A, gsl_matrix * V, gsl_vector * S, gsl_vector * work)
    //La matriu A es substitueix per U a la sortida
    gsl_linalg_SV_decomp(U1,V1,s,work);

    gsl_matrix_memcpy (U2, matrixB);
    gsl_linalg_SV_decomp(U2,V2,s,work);

    //F = U1 VS2 V1^T = U1 U2^T A2 V2 V1^T
    gsl_matrix *F=gsl_matrix_alloc(matrixA->size1,matrixA->size1);
    gsl_matrix_transpose(U2);
    multiplica(F,U1,U2);
    multiplica(F,F,matrixB);
    multiplica(F,F,V2);
    gsl_matrix_transpose(V1);
    multiplica(F,F,V1);

    //F ja esta calculada. Calculem la norma.
    delta=0;
    for(int i=0; i<matrixA->size1; i++){
    for(int j=0; j<matrixA->size1; j++){
        delta+=pow(gsl_matrix_get(matrixA,i,j)-gsl_matrix_get(F,i,j),2);
    }
    }
    delta=std::pow(delta,0.5f);
    delta/=matrixA->size1;

    printingCompareMatrixResults(delta,F,matrixA);
    FreeMatrix(&work,
               &s,
              &U1,
               &U2,
               &V1,
               &V2,
               &F );

    return delta;
}
コード例 #2
0
ファイル: xmi_aux.c プロジェクト: srbauter/xmimsim
void xmi_inverse_matrix(double x[3], double y[3], double z[3], double **inverseF) {

	gsl_matrix *m = gsl_matrix_alloc(3,3);
	gsl_matrix *inverse = gsl_matrix_alloc(3,3);
	gsl_permutation *p = gsl_permutation_calloc(3);
	int signum;
	double *rv;
	int i,j,k;


	gsl_matrix_set(m,0,0, x[0]);
	gsl_matrix_set(m,1,0, x[1]);
	gsl_matrix_set(m,2,0, x[2]);

	gsl_matrix_set(m,0,1, y[0]);
	gsl_matrix_set(m,1,1, y[1]);
	gsl_matrix_set(m,2,1, y[2]);

	gsl_matrix_set(m,0,2, z[0]);
	gsl_matrix_set(m,1,2, z[1]);
	gsl_matrix_set(m,2,2, z[2]);

#if DEBUG == 2
	fprintf(stdout,"input matrix\n");
	gsl_matrix_fprintf(stdout,m , "%g");
#endif

	//invert the sucker
	gsl_linalg_LU_decomp(m,p,&signum);
	gsl_linalg_LU_invert(m,p,inverse);
#if DEBUG == 2
	fprintf(stdout,"inverted matrix\n");
	gsl_matrix_fprintf(stdout,inverse , "%g");
#endif

	gsl_matrix_transpose(inverse);
#if DEBUG == 2
	fprintf(stdout,"transposed inverted matrix\n");
	gsl_matrix_fprintf(stdout,inverse , "%g");
#endif

	rv = (double *) malloc(9*sizeof(double));

	k = 0;

	for (i = 0 ; i < 3 ; i++)
		for (j = 0 ; j < 3 ; j++) 
			rv[k++] = gsl_matrix_get(inverse, i,j);

	gsl_matrix_free(m);
	gsl_matrix_free(inverse);
	gsl_permutation_free(p);

	*inverseF = rv;
}
コード例 #3
0
ファイル: umeyama.cpp プロジェクト: bengheng/Expose
int ComputeHermitianMatrix(const gsl_matrix *const M,
                           gsl_matrix_complex * const E,
			   gsl_matrix *const S,
			   gsl_matrix *const N)
{
	unsigned int i, j;
	gsl_complex z;

	// S = (M + M^T)/2
	gsl_matrix_memcpy(S, M);
	gsl_matrix_transpose(S);
	gsl_matrix_add(S, M);
	gsl_matrix_scale(S, 0.5);

	// N = (M - M^T)/2
	gsl_matrix_memcpy(N, M);
	gsl_matrix_transpose(N);
	gsl_matrix_scale(N, -1);
	gsl_matrix_add(N, M);
	gsl_matrix_scale(N, 0.5);

	for(i = 0; i < M->size1; i++)
	{
		for(j = 0 ; j < M->size2; j++)
		{
			GSL_SET_COMPLEX(&z,
			    gsl_matrix_get(S, i, j),
			    gsl_matrix_get(N, i, j));

			gsl_matrix_complex_set(E, i, j, z);
		}
	}


	return GSL_SUCCESS;
}
コード例 #4
0
ファイル: VarproFunction.cpp プロジェクト: jiangshaowu/slra
void VarproFunction::computeDefaultRTheta( gsl_matrix *RTheta ) {
  size_t c_size1 = getN(), c_size2 = getNrow();
  size_t status = 0;
  size_t minus1 = -1;
  double tmp;

  gsl_matrix * tempc = gsl_matrix_alloc(c_size1, c_size2);
  if (myPhi == NULL) {
    gsl_matrix_memcpy(tempc, myMatr);
  } else {
    gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1, myMatr, myPhi, 0, tempc);
  }
  
  gsl_matrix * tempu = gsl_matrix_alloc(c_size2, c_size2);
  double *s = new double[mymin(c_size1, c_size2)];
  
  /* Determine optimal work */
  size_t lwork;
  dgesvd_("A", "N", &tempc->size2, &tempc->size1, tempc->data, &tempc->tda, s,
     tempu->data, &tempu->size2, NULL, &tempc->size1, &tmp, &minus1, &status);
  double *work = new double[(lwork = tmp)];
  /* Compute low-rank approximation */ 
  dgesvd_("A", "N", &tempc->size2, &tempc->size1, tempc->data, &tempc->tda, s,
     tempu->data, &tempu->size2, NULL, &tempc->size1, work, &lwork, &status);

  if (status) {
    delete [] s;  
    delete [] work;  
    gsl_matrix_free(tempc);
    gsl_matrix_free(tempu);
    throw new Exception("Error computing initial approximation: "
                        "DGESVD didn't converge\n");
  }

  gsl_matrix_transpose(tempu);
  gsl_matrix_view RlraT;
  RlraT = gsl_matrix_submatrix(tempu, 0, tempu->size2 - RTheta->size2, 
                               tempu->size1, RTheta->size2);
  gsl_matrix_memcpy(RTheta, &(RlraT.matrix));
    
  delete [] s;  
  delete [] work;  
  gsl_matrix_free(tempc);
  gsl_matrix_free(tempu);
}
コード例 #5
0
ファイル: umeyama.cpp プロジェクト: bengheng/Expose
/*!
Computes permutation matrix.
*/
int ComputePermMatrix(gsl_matrix * const UA,
                      gsl_matrix * const UB,
                      gsl_matrix * const P)
{
	gsl_matrix_transpose(UA);

	#ifdef VERBOSE
		PrintGSLMatrix(UA, "WA");
		PrintGSLMatrix(UB, "WB");
	#endif

	MulGSLMatrices(UB, UA, P);
	#ifdef VERBOSE
		PrintGSLMatrix(P, "Permutation Matrix");
	#endif

	return GSL_SUCCESS;
}
コード例 #6
0
ファイル: support.cpp プロジェクト: renato-monaro/OEMTP
bool Matrix_Transpose(gsl_matrix *A){
 	gsl_matrix_transpose(A);
	return true;
	}
コード例 #7
0
ファイル: linalg.c プロジェクト: ihrke/libeegtools
/** \brief Principal Components analysis.

	 \ingroup grplinalg

	 This implementation uses SVD to calculate the PCA.
	 Example:
	 \code
	 Array *X = get_data_from_somewhere();
	 Array *var, *X_pca;
	 matrix_pca( X, &var, FALSE ); // overwrite X
	 X_pca = matrix_pca( X, &var, TRUE ); // do not touch X
	 \endcode
	 \param X a 2D array observations x variables containing the data
	 \param var output: vector of eigenvalues of XX^T in decreasing order; if you
 	         pass NULL, it is ignored; 
	 \param alloc if true, new memory is allocated and returned. Else
	            X is overwritten.
	 \return pointer to the PCA'd matrix 
*/
Array* matrix_pca( Array *X, Array **var, bool alloc ){
  Array *out=NULL;
  int i,j;
  bool ismatrix;
  matrix_CHECK( ismatrix, X );
  if( !ismatrix ) return NULL;

  int N,K; /* N observations, K variables */
  N = X->size[0];
  K = X->size[1];

  Array *tmp = array_copy( X, TRUE );

  /* subtract mean from observations */
  Array *mean=matrix_mean( X, 0 ); 
  for( i=0; i<N; i++ ){ 
	 for( j=0; j<K; j++ ){
		array_INDEX2( tmp, double, i, j ) -=
		  array_INDEX1( mean, double, j );
	 }
  }

  array_scale( tmp, 1.0/sqrt((double) N-1 ) );

  gsl_matrix *A=matrix_to_gsl( tmp, TRUE ); /* copy */
  gsl_matrix *V=gsl_matrix_alloc( K, K );
  gsl_vector *S=gsl_vector_alloc( K );
  gsl_vector *workspace=gsl_vector_alloc( K );

  /* A->U, V->V, S->S */
  gsl_linalg_SV_decomp( A, V, S, workspace);
  gsl_matrix_transpose( V );

  if( var ){
	 (*var)=array_fromptr2( DOUBLE, 1, S->data, S->size );
	 S->owner=0; /* transfer ownership to array */
	 (*var)->free_data=1;
	 for( i=0; i<array_NUMEL( *var ); i++ ){ 
		array_INDEX1( *var, double, i ) = SQR( array_INDEX1( *var, double, i ) );
	 }
  }

  Array *Vp=array_fromptr2( DOUBLE, 2, V->data, V->size1, V->size2 );
  matrix_transpose( tmp, FALSE );
  out=matrix_mult( Vp, tmp ); /* PCA'd data */
  matrix_transpose( out, FALSE );

  if( out->size[0]!=X->size[0] || out->size[1]!=X->size[1] ){
	 errprintf("Input/Output dimension mismatch: (%i,%i) vs. (%i,%i)\n",
				  X->size[0], X->size[1], out->size[0], out->size[1] );
  }

  if( !alloc ){ /* write back out->X */
	 memcpy( X->data, out->data, out->nbytes );
	 array_free( out );
	 out = X;
  }

  /* clean up */
  gsl_matrix_free( A );
  gsl_matrix_free( V );
  gsl_vector_free( S );
  gsl_vector_free( workspace );
  array_free( mean );
  array_free( Vp );
  array_free( tmp );

  return out;
}
コード例 #8
0
ファイル: chol.c プロジェクト: dahlem/linearSolv
int chol(gsl_matrix *A, gsl_vector *b, gsl_vector *x,
         gsl_vector **x_bar, gsl_vector **x_error, double *max_error)
{
    gsl_matrix *ML, *MU, *L;
    gsl_vector *vec, *y_bar;
    size_t j;
    int status;
    

    if (b->size != A->size1) {
        return MATRIX_VECTOR_UNEQUAL_ROW_DIM;
    }
    
/*     if ((status = isPositiveDefinite(A))) { */
/*         return status; */
/*     } */

    if ((status = cholcrout(A, &L))) {
        return status;
    }

    /* prepare the (L|b) matrix */
    ML = gsl_matrix_alloc(L->size1, L->size2 + 1);
    vec = gsl_vector_alloc(L->size2);
    
    for (j = 0; j < L->size2; ++j) {
        gsl_matrix_get_col(vec, L, j);
        gsl_matrix_set_col(ML, j, vec);
    }
    
    gsl_matrix_set_col(ML, ML->size2 - 1, b);

    /* solve the (L|b) matrix using forwards substitution */
    if ((status = subst_forwards(ML, &y_bar))) {
        return status;
    }

    /* prepare the (L'|b) matrix */
    gsl_matrix_transpose(L);
    MU = gsl_matrix_alloc(L->size1, L->size2 + 1);
    
    for (j = 0; j < L->size2; ++j) {
        gsl_matrix_get_col(vec, L, j);
        gsl_matrix_set_col(MU, j, vec);
    }
    gsl_vector_free(vec);
    
    gsl_matrix_set_col(MU, MU->size2 - 1, y_bar);

    /* solve the (U|b) matrix using backwards substitution */
    if ((status = subst_backwards(MU, x_bar))) {
        return status;
    }

    gsl_vector_free(y_bar);
    gsl_matrix_free(ML);
    gsl_matrix_free(MU);
    gsl_matrix_free(L);

    /* get the error statistics */
    gatherErrors(*x_bar, x, x_error, max_error);
    
    return 0;
}
コード例 #9
0
ファイル: fbfoptics.c プロジェクト: jonbramble/FBF-Optics
int dietens(gsl_matrix * ep, double eav, double dem, double S, double stheta, double ctheta, double sphi, double cphi)
{
	gsl_matrix * A = gsl_matrix_alloc(3,3);
	gsl_matrix * epsilon = gsl_matrix_alloc(3,3);
	gsl_matrix * ea = gsl_matrix_alloc(3,3);

	gsl_matrix_set_zero(epsilon);

	gsl_matrix_set(A,0,0,cphi*ctheta);
	gsl_matrix_set(A,0,1,sphi);
	gsl_matrix_set(A,0,2,-cphi*stheta);

	gsl_matrix_set(A,1,0,-sphi*ctheta);
	gsl_matrix_set(A,1,1,cphi);
	gsl_matrix_set(A,1,2,sphi*stheta);

	gsl_matrix_set(A,2,0,stheta);
	gsl_matrix_set(A,2,1,0.0);
	gsl_matrix_set(A,2,2,ctheta);

	gsl_matrix_set(epsilon,0,0,eav-(1/3)*S*dem);
	gsl_matrix_set(epsilon,1,1,eav-(1/3)*S*dem);
	gsl_matrix_set(epsilon,2,2,eav+(2/3)*S*dem);

	gsl_blas_dgemm(CblasTrans, CblasTrans, 1.0, epsilon, A, 0.0, ea);
	gsl_matrix_transpose(A);//transpose A but dont need if eij=eji

	//LU solve here, could use a symmetrical eg Cholesky
	{
	gsl_matrix *K = gsl_matrix_alloc(4, 4);
	gsl_permutation *p = gsl_permutation_alloc(4);
	gsl_vector *x = gsl_vector_alloc(4);

	gsl_vector_view bp;
	double z;
	int i,j,s;

	gsl_matrix_memcpy(K,A);
	for (i = 0; i < 4; i++)
	{
		bp = gsl_matrix_column(ea, i);
		gsl_linalg_LU_decomp(A, p, &s);
		gsl_linalg_LU_solve(A, p, &bp.vector, x);
		for (j = 0; j < 4; j++)
		{
			z = gsl_vector_get(x, j);
			gsl_matrix_set(ep,i,j,z); //'through the looking glass' transpose
		}
		gsl_matrix_memcpy(A,K);
	}

	gsl_matrix_free(A);
	gsl_matrix_free(epsilon);
	gsl_matrix_free(ea);
	gsl_matrix_free(K);
	gsl_permutation_free(p);
	gsl_vector_free(x);

	}
	return 1;
}
コード例 #10
0
match_result algorithm_umeyama::match(graph& g, graph& h,gsl_matrix* gm_P_i,gsl_matrix* gm_ldh,double dalpha_ldh)
{
	if (bverbose)
		*gout<<"Umeyama algorithm"<<std::endl;	
	bool bblast_match_end=(get_param_i("blast_match_proj")==1);
	//some duplicate variables
	gsl_matrix* gm_Ag_d=g.get_descmatrix(cdesc_matrix);
	gsl_matrix* gm_Ah_d=h.get_descmatrix(cdesc_matrix);
	if (pdebug.ivalue) gsl_matrix_printout(gm_Ag_d,"Ag",pdebug.strvalue); 
	if (pdebug.ivalue) gsl_matrix_printout(gm_Ah_d,"Ah",pdebug.strvalue);
	//memory allocation
	gsl_eigen_symmv_workspace * gesw= gsl_eigen_symmv_alloc (N);
	gsl_vector* eval_g=gsl_vector_alloc(N);
	gsl_vector* eval_h=gsl_vector_alloc(N);
	gsl_matrix* evec_g=gsl_matrix_alloc(N,N);
	gsl_matrix* evec_h=gsl_matrix_alloc(N,N);
	if (bverbose) *gout<<"Memory allocation finished"<<std::endl;
	//eigenvalues and eigenvectors for both matrices
	gsl_eigen_symmv (gm_Ag_d, eval_g,evec_g,gesw);
	if (bverbose) *gout<<"Ag eigen vectors"<<std::endl;
	gsl_eigen_symmv (gm_Ah_d, eval_h,evec_h,gesw);
	
	gsl_matrix_free(gm_Ag_d);
	gsl_matrix_free(gm_Ah_d);
	
	if (bverbose) *gout<<"Ah eigen vectors"<<std::endl;
	gsl_eigen_symmv_sort (eval_g, evec_g, GSL_EIGEN_SORT_VAL_DESC);
	gsl_eigen_symmv_sort (eval_h, evec_h, GSL_EIGEN_SORT_VAL_DESC);
	
	if (pdebug.ivalue){ gsl_matrix_printout(eval_g,"eval_g",pdebug.strvalue); 
			    gsl_matrix_printout(eval_h,"eval_h",pdebug.strvalue); 
	 		    gsl_matrix_printout(evec_g,"evec_g",pdebug.strvalue);
			    gsl_matrix_printout(evec_h,"evec_h",pdebug.strvalue);};
	gsl_matrix_abs(evec_g);
	gsl_matrix_abs(evec_h);
	if (pdebug.ivalue) gsl_matrix_printout(evec_g,"abs(evec_g)",pdebug.strvalue);
	if (pdebug.ivalue) gsl_matrix_printout(evec_h,"abs(evec_h)",pdebug.strvalue);  
	//loss matrix construction
	gsl_matrix* C=gsl_matrix_alloc(N,N);
	if (bverbose) *gout<<"Loss function matrix allocation"<<std::endl;
	gsl_blas_dgemm(CblasNoTrans,CblasTrans,1,evec_g,evec_h,0,C);
	if (pdebug.ivalue) gsl_matrix_printout(C,"C=abs(evec_g)*abs(evec_h')",pdebug.strvalue); 
	//label cost matrix
	update_C_hungarian(C,-1);
	//scaling for hungarian
	double dscale_factor =gsl_matrix_max_abs(C);
	dscale_factor=(dscale_factor>EPSILON)?dscale_factor:EPSILON;
	dscale_factor=10000/dscale_factor;
	gsl_matrix_scale(C,-dscale_factor);
	gsl_matrix_transpose(C);
	if (pdebug.ivalue) gsl_matrix_printout(C,"scale(C)",pdebug.strvalue); 
	gsl_matrix* gm_P=gsl_matrix_alloc(N,N);
        gsl_matrix_hungarian(C,gm_P,NULL,NULL,false,(bblast_match_end?gm_ldh:NULL),false);
	if (pdebug.ivalue) gsl_matrix_printout(gm_P,"gm_P",pdebug.strvalue); 
	if (bverbose) *gout<<"Hungarian solved"<<std::endl;
	match_result mres;
	mres.gm_P=gm_P;
	

	//initial score
	mres.vd_trace.push_back(graph_dist(g,h,cscore_matrix));
	//final score
	mres.vd_trace.push_back(graph_dist(g,h,gm_P,cscore_matrix));
	//other output parameters
	mres.dres=mres.vd_trace.at(1);
	mres.inum_iteration=2;
	//transpose matrix save
	mres.gm_P=gm_P;
	mres.gm_P_exact=NULL;
	return mres;
}
コード例 #11
0
/*
in matlab or octave
orig = [2.580000 -3.100000 4.250000
> 3.821000 4.440000 5.656000
> 1.820000 7.410000 3.330000]
orig =

   2.5800  -3.1000   4.2500
   3.8210   4.4400   5.6560
   1.8200   7.4100   3.3300

octave:4> trans = orig'
trans =

   2.5800   3.8210   1.8200
  -3.1000   4.4400   7.4100
   4.2500   5.6560   3.3300
*/     
int main (void) {
       int i, j; 
       FILE *opointer;
       opointer = fopen("initial.txt","w");

       FILE *tpointer;
       tpointer = fopen("transpose.txt","w");
       char *ofmt;
       ofmt = "%f";
       printf("The output file format ofmt %s \n",ofmt);
       printf("will be used in gsl_matrix_fprintf (opointer, m, ofmt)\n");
       gsl_matrix * m = gsl_matrix_alloc (3, 3);
       gsl_matrix_set (m, 0, 0, 2.58);
       gsl_matrix_set (m, 0, 1, -3.1);
       gsl_matrix_set (m, 0, 2, 4.25);
       gsl_matrix_set (m, 1, 0, 3.821);
       gsl_matrix_set (m, 1, 1, 4.44);
       gsl_matrix_set (m, 1, 2, 5.656);
       gsl_matrix_set (m, 2, 0, 1.82);
       gsl_matrix_set (m, 2, 1, 7.41);
       gsl_matrix_set (m, 2, 2, 3.33);
/*
Function: int gsl_matrix_fprintf (FILE * stream, const gsl_matrix * m, const char * format)

    This function writes the elements of the matrix m line-by-line to the stream stream using the format specifier format, which should be one of the %g, %e or %f formats for floating point numbers and %d for integers. The function returns 0 for success and GSL_EFAILED if there was a problem writing to the file. 
*/
       gsl_matrix_fprintf (opointer, m, ofmt);
       printf ("Initial test matrice \n");
       for (i = 0; i < 3; i++) {
         for (j = 0; j < 3; j++) {
           printf ("m(%d,%d) = %g\n", i, j,
           gsl_matrix_get (m, i, j)); 
          }
        }
        printf ("transpose of initial matrice \n");
        printf ("the matrice needs to be square\n");
        printf ("%x\n",*m);
        printf ("sizeof of struct m %d  \n",sizeof(*m));
        printf("num of rows %d\n",m->size1);
        printf("num of cols %d\n",m->size2);
        if (m->size1 == m->size2) { 
          gsl_matrix_transpose (m);
        for (i = 0; i < 3; i++) {
         for (j = 0; j < 3; j++) {
           printf ("m(%d,%d) = %g\n", i, j,
           gsl_matrix_get (m, i, j)); 
          }
        }
        gsl_matrix_fprintf (tpointer, m, ofmt); 
        }
        else printf("the matrice is not square can not transpose\n");
        gsl_matrix_set_identity (m);
        printf ("The identity matrice \n");
       for (i = 0; i < 3; i++) {
         for (j = 0; j < 3; j++) {
           printf ("m(%d,%d) = %g\n", i, j,
           gsl_matrix_get (m, i, j)); 
          }
        }         
       gsl_matrix_free (m);
     
       return 0;
     }
コード例 #12
0
ファイル: ssc.c プロジェクト: Bcambs/maebot-demo
int
ssc_inverse (double X_ji[6], double J_minus[6*6], const double X_ij[6])
{
    GSLU_MATRIX_VIEW (R_ij, 3, 3);
    so3_rotxyz (R_ij.data, SSC_RPH (X_ij));

    // X_ji
    const double h_ji = atan2 (R_ij(0,1), R_ij(0,0));
#ifdef _GNU_SOURCE
    double sh_ji, ch_ji;
    sincos (h_ji, &sh_ji, &ch_ji);
#else
    double sh_ji = sin (h_ji), ch_ji = cos(h_ji);
#endif

    const double x_ji = -(R_ij(0,0)*X_ij(0) + R_ij(1,0)*X_ij(1) + R_ij(2,0)*X_ij(2));
    const double y_ji = -(R_ij(0,1)*X_ij(0) + R_ij(1,1)*X_ij(1) + R_ij(2,1)*X_ij(2));
    const double z_ji = -(R_ij(0,2)*X_ij(0) + R_ij(1,2)*X_ij(1) + R_ij(2,2)*X_ij(2));
    const double r_ji = atan2 (R_ij(2,0)*sh_ji - R_ij(2,1)*ch_ji, -R_ij(1,0)*sh_ji + R_ij(1,1)*ch_ji);
    const double p_ji = atan2 (-R_ij(0,2), R_ij(0,0)*ch_ji + R_ij(0,1)*sh_ji);

    X_ji(SSC_DOF_X) = x_ji;
    X_ji(SSC_DOF_Y) = y_ji;
    X_ji(SSC_DOF_Z) = z_ji;
    X_ji(SSC_DOF_R) = r_ji;
    X_ji(SSC_DOF_P) = p_ji;
    X_ji(SSC_DOF_H) = h_ji;

    if (J_minus != NULL) {
        const double x_ij=X_ij(SSC_DOF_X), y_ij=X_ij(SSC_DOF_Y), z_ij=X_ij(SSC_DOF_Z);
        const double r_ij=X_ij(SSC_DOF_R), p_ij=X_ij(SSC_DOF_P), h_ij=X_ij(SSC_DOF_H);

#ifdef _GNU_SOURCE
        double sr_ij, cr_ij, sp_ij, cp_ij, sh_ij, ch_ij;
        sincos (r_ij, &sr_ij, &cr_ij);
        sincos (p_ij, &sp_ij, &cp_ij);
        sincos (h_ij, &sh_ij, &ch_ij);
#else
        double sr_ij = sin (r_ij), cr_ij = cos (r_ij);
        double sp_ij = sin (p_ij), cp_ij = cos (p_ij);
        double sh_ij = sin (h_ij), ch_ij = cos (h_ij);
#endif

        // N
        double tmp = x_ij*ch_ij + y_ij*sh_ij;
        const double N_data[] = {
             0,    -R_ij(2,0)*tmp + z_ij*cp_ij,       R_ij(1,0)*x_ij - R_ij(0,0)*y_ij,
             z_ji, -R_ij(2,1)*tmp + z_ij*sp_ij*sr_ij, R_ij(1,1)*x_ij - R_ij(0,1)*y_ij,
            -y_ji, -R_ij(2,2)*tmp + z_ij*sp_ij*cr_ij, R_ij(1,2)*x_ij - R_ij(0,2)*y_ij
        };
        gsl_matrix_const_view N = gsl_matrix_const_view_array (N_data, 3, 3);

        // Q
        tmp = sqrt (1-R_ij(0,2)*R_ij(0,2));
        double Q_data[] = {
            -R_ij(0,0),           -R_ij(0,1)*cr_ij,      R_ij(0,2)*R_ij(2,2),
             R_ij(0,1)*tmp,       -R_ij(2,2)*ch_ij*tmp,  R_ij(1,2)*tmp,
             R_ij(0,2)*R_ij(0,0), -R_ij(1,2)*ch_ij,     -R_ij(2,2)
        };
        gsl_matrix_view Q = gsl_matrix_view_array (Q_data, 3, 3);
        gsl_matrix_scale (&Q.matrix, 1./(tmp*tmp));

        // J_minus
        gsl_matrix_view J = gsl_matrix_view_array (J_minus, 6, 6);
        gsl_matrix_set_zero (&J.matrix);
        gsl_matrix_transpose (&R_ij.matrix);
        gsl_matrix_scale (&R_ij.matrix, -1.0);
        gslu_matrix_set_submatrix (&J.matrix, 0, 0, &R_ij.matrix); // -R_ij'
        gslu_matrix_set_submatrix (&J.matrix, 0, 3, &N.matrix);
        gslu_matrix_set_submatrix (&J.matrix, 3, 3, &Q.matrix);
    }
    return GSL_SUCCESS;
}
コード例 #13
0
ファイル: hungarian.cpp プロジェクト: HossainTanvir/uni
void gsl_matrix_hungarian(gsl_matrix* gm_C,gsl_matrix* gm_P,gsl_vector* gv_col_inc, gsl_permutation* gp_sol, int _bprev_init, gsl_matrix *gm_C_denied, bool bgreedy)
{
//  mexPrintf("VV\n");  
  long dim, startdim, enddim, n1,n2;
  double *C;
  int i,j;
  int **m;
  double *z;
  hungarian_problem_t p, *q;
  int matrix_size;
  double C_min=gsl_matrix_min(gm_C)-1;
  n1 = gm_C->size1;    /* first dimension of the cost matrix */
  n2 = gm_C->size2;    /* second dimension of the cost matrix */
  C = gm_C->data; 


   //greedy solution
   if (bgreedy)
   {
	int ind,ind1,ind2;
	size_t *C_ind=new size_t[n1*n2];
	gsl_heapsort_index(C_ind,C,n1*n2,sizeof(double),compare_doubles);
        bool* bperm_fix_1=new bool[n1]; bool* bperm_fix_2=new bool[n2]; int inummatch=0;
	for (i=0;i<n1;i++) {bperm_fix_1[i]=false;bperm_fix_2[i]=false;};
	gsl_matrix_set_zero(gm_P);
	for (long l=0;l<n1*n2;l++)
	{
		ind=C_ind[l];
		ind1=floor(ind/n1);
		ind2=ind%n2;
		
		if (!bperm_fix_1[ind1] and !bperm_fix_2[ind2])
		{
			bperm_fix_1[ind1]=true; bperm_fix_2[ind2]=true;
			gm_P->data[ind]=1;inummatch++;
		};
		if (inummatch==n1) break;
	};
	delete[] bperm_fix_1;delete[] bperm_fix_2;
	//because C is a transpose matrix
	gsl_matrix_transpose(gm_P);
	return;	
   };
  double C_max=((gsl_matrix_max(gm_C)-C_min>1)?(gsl_matrix_max(gm_C)-C_min):1)*(n1>n2?n1:n2);
  m = (int**)calloc(n1,sizeof(int*)); 
//			mexPrintf("C[2] = %f \n",C[2]);
  for (i=0;i<n1;i++)
        {
        	m[i] = (int*)calloc(n2,sizeof(int));  
        	for (j=0;j<n2;j++)
            		m[i][j] = (int) (C[i+n1*j] - C_min);
//			mexPrintf("m[%d][%d] = %f  %f\n",i,j,m[i][j],C[i+n1*j] - C_min);
		if (gm_C_denied!=NULL)
		for (j=0;j<n2;j++){
			if (j==30)
				int dbg=1;
			bool bden=(gm_C_denied->data[n2*i+j]<1e-10);
            		if (bden) m[i][j] =C_max;
			else 
				int dbg=1;
			};
 	};
    //normalization: rows and columns
//			mexPrintf("C[2] = %f \n",C[2]);
    double dmin;
    for (i=0;i<n1;i++)
        {
        	dmin=m[i][0];
        	for (j=1;j<n2;j++)
            		dmin= (m[i][j]<dmin)? m[i][j]:dmin;
        	for (j=0;j<n2;j++)
            		m[i][j]-=dmin;
 	};
    for (j=0;j<n2;j++)
        {
        	dmin=m[0][j];
        	for (i=1;i<n1;i++)
            		dmin= (m[i][j]<dmin)? m[i][j]:dmin;
        	for (i=0;i<n1;i++)
            		m[i][j]-=dmin;
 	};
   if ((_bprev_init) &&(gv_col_inc !=NULL))
	{
	//dual solution v substraction
		for (j=0;j<n2;j++)
        		for (i=0;i<n1;i++)
				m[i][j]-=gv_col_inc->data[j];
	//permutation of m columns
		int *mt = new int[n2];
		for (i=0;i<n1;i++)
		{
			for (j=0;j<n2;j++) mt[j]=m[i][j];
			for (j=0;j<n2;j++) m[i][j]=mt[gsl_permutation_get(gp_sol,j)];
		};
		delete[] mt;
		
	};

   
  /* initialize the hungarian_problem using the cost matrix*/
   matrix_size = hungarian_init(&p, m , n1,n2, HUNGARIAN_MODE_MINIMIZE_COST) ;
  /* solve the assignement problem */
  hungarian_solve(&p);
  q = &p;
  //gsl_matrix* gm_P=gsl_matrix_alloc(n1,n2);
  gsl_permutation* gp_sol_inv=gsl_permutation_alloc(n2);
  if (gp_sol!=NULL)
  	gsl_permutation_inverse(gp_sol_inv,gp_sol);
  else
	gsl_permutation_init(gp_sol_inv);
  for (i=0;i<n1;i++)
         for (j=0;j<n2;j++)
              gsl_matrix_set(gm_P,i,j,q->assignment[i][gp_sol_inv->data[j]]);
  //initialization by the previous solution
  if ((_bprev_init) &&(gv_col_inc !=NULL))
        for (j=0;j<n2;j++)
		gv_col_inc->data[j]=q->col_inc[gp_sol_inv->data[j]];
  if ((_bprev_init) && (gp_sol!=NULL))
  {
  for (i=0;i<n1;i++)
         for (j=0;j<n2;j++)
  		if (gsl_matrix_get(gm_P,i,j)==HUNGARIAN_ASSIGNED)
			gp_sol->data[i]=j;
  };
  /* free used memory */
  gsl_permutation_free(gp_sol_inv);
  hungarian_free(&p);
  for (i=0;i<n1;i++)
        free(m[i]);
  free(m);

/*  for (int i=0;i<gm_C->size1;i++)
        {
        	for (int j=0;j<gm_C->size1;j++)
		{
			mexPrintf("G[%d][%d] = %f  %f \n",i,j,gsl_matrix_get(gm_P,i,j),gsl_matrix_get(gm_C,i,j));
		}
	}*/



//  mexPrintf("AAA");
  //return gm_P;
}
コード例 #14
0
ファイル: algorithm_ca.cpp プロジェクト: HossainTanvir/uni
match_result algorithm_ca::match(graph& g, graph& h,gsl_matrix* gm_P_i,gsl_matrix* _gm_ldh,double dalpha_ldh)
{
	double dhung_max=get_param_d("hungarian_max");
	bool bblast_match_end=(get_param_i("blast_match_proj")==1);	
	bool bblast_match=(get_param_i("blast_match")==1);
	double dfw_xeps=get_param_d("algo_fw_xeps");
	double bgreedy=(get_param_i("hungarian_greedy")==1);
	double dfvalue;
	if (bverbose)
		*gout<<"C-adaptation strategy"<<std::endl;	
	//some duplicate variables
	gsl_matrix* gm_Ag_d=g.get_descmatrix(cdesc_matrix);
	gsl_matrix* gm_Ah_d=h.get_descmatrix(cdesc_matrix);
	gsl_matrix * gm_C_a=gsl_matrix_alloc(N,N);
	gsl_matrix * gm_C_up=gsl_matrix_alloc(N,N);
	gsl_matrix * gm_P=gsl_matrix_alloc(N,N);
	gsl_matrix * gm_temp=gsl_matrix_alloc(N,N);
	//initialization
	gsl_matrix_memcpy(gm_C_a,gm_P_i);
	//cycle over linear combination of linear and non linear terms
	double astep=1e-30;bool bcont=true;
	if (dalpha_ldh>0)
		gsl_matrix_scale(gm_ldh,dalpha_ldh);

	while (bcont){
	bcont=(astep<1);
	//optimal permutation
	gsl_matrix_scale(gm_C_a,-dhung_max);
	gsl_matrix_transpose(gm_C_a);
	gsl_matrix_hungarian(gm_C_a,gm_P,NULL,NULL,false,(bblast_match?gm_ldh:NULL),bgreedy);
	gsl_matrix_transpose(gm_C_a);
	gsl_matrix_scale(gm_C_a,-1.0/dhung_max);
	//C-matrix update
	gsl_blas_dgemm(CblasNoTrans,CblasNoTrans,1,gm_Ag_d,gm_P,0,gm_temp);
	gsl_blas_dgemm(CblasNoTrans,CblasNoTrans,1,gm_temp,gm_Ah_d,0,gm_C_up);
	gsl_matrix_scale(gm_C_up,1-dalpha_ldh);
	if (dalpha_ldh>0) gsl_matrix_add(gm_C_up,gm_ldh);
	gsl_matrix_scale(gm_C_a,1-astep);
	gsl_matrix_scale(gm_C_up,astep);
	gsl_matrix_add(gm_C_a,gm_C_up);
	dfvalue=f_qcv(gm_Ag_d,gm_Ah_d,gm_P,gm_temp,true);
	if (bverbose) *gout<<"astep="<<astep<<", f="<<dfvalue<<std::endl;
	astep+=0.01;//0.01*astep;
	astep=(astep<1)?astep:1;
	};
	gsl_matrix_free(gm_Ag_d);
	gsl_matrix_free(gm_Ah_d);
	gsl_matrix_free(gm_temp);
	gsl_matrix_free(gm_C_up);
	gsl_matrix_free(gm_C_a);
	if (dalpha_ldh>0)
		gsl_matrix_scale(gm_ldh,1.0/dalpha_ldh);
	
	match_result mres;
	mres.gm_P=gm_P;
	
	//initial score
	mres.vd_trace.push_back(graph_dist(g,h,cscore_matrix));
	//final score
	mres.vd_trace.push_back(graph_dist(g,h,gm_P,cscore_matrix));
	//other output parameters
	mres.dres=mres.vd_trace.at(1);
	mres.inum_iteration=2;
	//transpose matrix save
	mres.gm_P=gm_P;
	mres.gm_P_exact=NULL;
	return mres;
}
コード例 #15
0
ファイル: my_tenzor1.cpp プロジェクト: vma13/University
int main() {
  int i,j,k;
  double s;
  std::vector< std::vector< std::vector<double> > > patients(count);
  
  for(i = 0; i<count; ++i) {
    std::cout << files[i] << std::endl;
    patients[i] = Patient(files[i]).data;
  } 

  gsl_matrix* A_avg = gsl_matrix_alloc(3, 64);
  for(i = 0; i<3; ++i) {
    for(j = 0; j<64; ++j) { 
      s = 0;
      for(k = 0; k < count; ++k) {
        s+=patients[k][i][j];
      }
      gsl_matrix_set(A_avg, i, j, s/count);            
    }
  }
  //std::cout << "A_avg" << std::endl; 
  //gsl_matrix_print(A_avg, 3, 64);

  gsl_matrix* S = gsl_matrix_alloc(3, 64);
  for(i = 0; i<3; ++i) {
    for(j = 0; j<64; ++j) { 
      s = 0;
      for(k = 0; k < count; ++k) {
        s += pow((patients[k][i][j] - gsl_matrix_get(A_avg, i, j)), 2);            
      }
      gsl_matrix_set(S, i, j, sqrt(s/count));            	
    }
  }
  //  std::cout << "S" << std::endl; 
  gsl_matrix_print(S, 3, 64);
  gsl_matrix *T[count];    
  for(k = 0; k < count; ++k) {
    T[k] =  gsl_matrix_alloc(3, 64);
    for(i = 0; i<3; ++i) {
      for(j = 0; j<64; ++j) { 
        s = (patients[k][i][j] - gsl_matrix_get(A_avg, i, j)) / gsl_matrix_get(S, i, j);            
        gsl_matrix_set(T[k], i, j, s);            	
      }
    }
  }
  size_t cube_sizes[3] = {3, 64, count};
  Tensor<3> cube(cube_sizes);
  size_t matrix_sizes[3] = {cube.size(), 1};
  Tensor<2> matrix(matrix_sizes);
  int M, N;
  std::cout << cube.size() << std::endl;
  for (size_t offset = 0; offset < cube.size(); ++offset) {
    i = offset/(3*64); //0...20
    j = (offset%(3*64))/64; //0...3
    k = (offset%(3*64))%64; //0...64 
    cube.data[offset] = gsl_matrix_get(T[i], j, k); // patients[i][j][k];
  }

  // start calculating, flatten
  std::cout << "HOSVD 3x(64*20)" << std::endl; 
  cube.flatten(matrix, 0);

  gsl_matrix* Ax = TensorToGSLMatrix(matrix);
  gsl_matrix* Ux;
  gsl_matrix* Vx;
  gsl_vector* Sx;
  gsl_vector* workx;


  //gsl_matrix_print(Ax, 1536,  3);

  N = Ax->size2;
  workx = gsl_vector_alloc(N);
  Sx = gsl_vector_alloc(N);
  Vx = gsl_matrix_alloc(N, N);

  gsl_linalg_SV_decomp(Ax, Vx, Sx, workx);
  //gsl_matrix_transpose (Vx);


  std::cout << "S1" << std::endl;
  gsl_vector_print(Sx, N);
  std::cout << "V" << std::endl;
  gsl_matrix_print(Vx, N , N);
  //std::cout << "work" << std::endl;
  //gsl_vector_print(workx, N);

  //Нам нужен Vx, это наше U; V(3x3)


/* FLATTEN HOSVD 64x(3*20) */
  std::cout << "HOSVD 64x(3*24)" << std::endl;
  cube.flatten(matrix, 1);
  //print(matrix);

  gsl_matrix* Ay = TensorToGSLMatrix(matrix);
  gsl_matrix* Uy;
  gsl_matrix* Vy;
  gsl_vector* Sy;
  gsl_vector* worky;
  N = Ay->size2;

  //gsl_matrix_print(Ay, Ay->size1, Ay->size2);
  worky = gsl_vector_alloc(N);
  Sy = gsl_vector_alloc(N);
  Vy = gsl_matrix_alloc(N, N);

  gsl_linalg_SV_decomp(Ay, Vy, Sy, worky);
  //gsl_matrix_transpose(Vy);

  std::cout << "S2" << std::endl;
  gsl_vector_print(Sy, N);
  //std::cout << "V" << std::endl;
  //gsl_matrix_print(Vy, Vy->size1, Vy->size2);

  //Нам нужен Vy, это наше V; V(3x3)


  /* FLATTEN HOSVD 20x(3*64) */
  std::cout << "HOSVD 20x(3*64)" << std::endl;
  cube.flatten(matrix, 2);
  //print(matrix);

  gsl_matrix* Az = TensorToGSLMatrix(matrix);
  gsl_matrix* Uz;
  gsl_matrix* Vz;
  gsl_vector* Sz;
  gsl_vector* workz;
  N = Az->size2; 

  //gsl_matrix_print(Ay, Ay->size1, Ay->size2);
  workz = gsl_vector_alloc(N);
  Sz = gsl_vector_alloc(N);
  Vz = gsl_matrix_alloc(N, N);

  gsl_linalg_SV_decomp(Az, Vz, Sz, workz);
  //  gsl_matrix_transpose(Vz);
  std::cout << "S3" << std::endl;
  gsl_vector_print(Sz, Az->size2);
  //std::cout << "V" << std::endl;
  //gsl_matrix_print(Vz, Vz->size1, Vz->size2);

  //Нам нужен Vz, это наше W; W(20x20)

  gsl_matrix *Vx_t, *tmp[count], *Z[count], *Z_avg;  
  Vx_t = gsl_matrix_alloc(Vx->size2, Vx->size1);
  gsl_matrix_transpose (Vz);
  

  for(i =0; i<count; ++i) {
    Z[i] = gsl_matrix_alloc(3,64);
    tmp[i] = gsl_matrix_alloc(3,64);
    gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, Vx_t, T[i], 0.0, tmp[i]);
    gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, tmp[i], Vy, 0.0, Z[i]);
  }



  std::cout << "qqq111" <<std::endl; 
  for(i = 0; i<1; ++i) {

    for(k =0; k<10; ++k) {
      for(j =0; j<3; ++j) {	
	std::cout << gsl_matrix_get(Z[i], j, k) << " ";
      }
      std::cout << std::endl;
    }
    //    if(i == 11) 
    std::cout << std::endl;

  }    



  return 0;
}
コード例 #16
0
void add_signal(
		Search_settings *sett,
		Command_line_opts *opts,
		Aux_arrays *aux_arr,
		Search_range *s_range) {

  int i, j, n, gsize, reffr, k; 
  double snr, sum = 0., h0, cof, thsnr = 0; 
  double sigma_noise = 1.0;
  double sinaadd, cosaadd, sindadd, cosdadd, phaseadd, shiftadd, signadd; 
  double nSource[3], sgnlo[10], sgnlol[4];
  double **sigaa, **sigbb;   // aa[nifo][N]
  sigaa = (double **)malloc(sett->nifo*sizeof(double *));
  for (k=0; k < sett->nifo; k++) sigaa[k] = (double *)calloc(sett->N, sizeof(double));
  sigbb = (double **)malloc(sett->nifo*sizeof(double *));
  for (k=0; k < sett->nifo; k++) sigbb[k] = (double *)calloc(sett->N, sizeof(double));
  
  FILE *data;
  
  // Signal parameters are read
  if ((data=fopen (opts->addsig, "r")) != NULL) {
	
    // Fscanning for the GW amplitude, grid size, hemisphere 
    // and the reference frame (for which the signal freq. is not spun-down/up)
    fscanf (data, "%le %d %d %d", &snr, &gsize, s_range->pmr, &reffr);    

    // Fscanning signal parameters: f, fdot, delta, alpha (sgnlo[0], ..., sgnlo[3])
    // four amplitudes sgnlo[4], ..., sgnlo[7] 
    // (see sigen.c and Phys. Rev. D 82, 022005 2010, Eqs. 2.13a-d) 
    // be1, be2 (sgnlo[8], sgnlo[9] to translate the sky position into grid position)  
    for(i=0; i<10; i++)
      fscanf(data, "%le",i+sgnlo); 
    
    fclose (data);
                 
  } else {
    perror (opts->addsig);
  }
  
  // Search-specific parametrization of freq. 
  // for the software injections
  // sgnlo[0]: frequency, sgnlo[1]: frequency. derivative  
  //#mb For VSR1 reffr=67
 
  sgnlo[0] += -2.*sgnlo[1]*(sett->N)*(reffr - opts->ident); 
 
  // Check if the signal is in band 
  if(sgnlo[0]<0) exit(171);          // &laquo;  
  else if (sgnlo[0]>M_PI) exit(187); // &raquo;

  cof = sett->oms + sgnlo[0]; 
  
  for(i=0; i<2; i++) sgnlol[i] = sgnlo[i]; 
  
  sgnlol[2] = sgnlo[8]*cof; 
  sgnlol[3] = sgnlo[9]*cof;  
 		 	
  // solving a linear system in order to translate 
  // sky position, frequency and spindown (sgnlo parameters) 
  // into the position in the grid
  
  double *MM ; 
  MM = (double *) calloc (16, sizeof (double));
  for(i=0; i<16; i++) MM[i] = sett->M[i] ;
  
  gsl_vector *x = gsl_vector_alloc (4);     
  int s;
  
  gsl_matrix_view m = gsl_matrix_view_array (MM, 4, 4);
  gsl_matrix_transpose (&m.matrix) ; 
  gsl_vector_view b = gsl_vector_view_array (sgnlol, 4);
  gsl_permutation *p = gsl_permutation_alloc (4);
  
  gsl_linalg_LU_decomp (&m.matrix, p, &s);
  gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
  
  s_range->spndr[0] = round(gsl_vector_get(x,1)); 
  s_range->nr[0] 	= round(gsl_vector_get(x,2));
  s_range->mr[0] 	= round(gsl_vector_get(x,3));
  
  gsl_permutation_free (p);
  gsl_vector_free (x);
  free (MM);
  
  // Define the grid range in which the signal will be looked for
  s_range->spndr[1] = s_range->spndr[0] + gsize; 
  s_range->spndr[0] -= gsize;
  s_range->nr[1] = s_range->nr[0] + gsize; 
  s_range->nr[0] -= gsize;
  s_range->mr[1] = s_range->mr[0] + gsize; 
  s_range->mr[0] -= gsize;
  s_range->pmr[1] = s_range->pmr[0]; 
  
  printf("add_signal() - the following grid range is used\n");
  printf("(spndr, nr, mr, pmr pairs): %d %d %d %d %d %d %d %d\n", \
   s_range->spndr[0], s_range->spndr[1], s_range->nr[0], s_range->nr[1],
   s_range->mr[0], s_range->mr[1], s_range->pmr[0], s_range->pmr[1]);

  // sgnlo[2]: declination, sgnlo[3]: right ascension 
  sindadd = sin(sgnlo[2]); 
  cosdadd = cos(sgnlo[2]); 
  sinaadd = sin(sgnlo[3]);  
  cosaadd = cos(sgnlo[3]); 
	
  // To keep coherent phase between time segments  
  double phaseshift = sgnlo[0]*sett->N*(reffr - opts->ident)   
    + sgnlo[1]*pow(sett->N*(reffr - opts->ident), 2); 

  // Loop for each detector 
  for(n=0; n<sett->nifo; n++) {
    
    modvir(sinaadd, cosaadd, sindadd, cosdadd,
	   sett->N, &ifo[n], aux_arr, sigaa[n], sigbb[n]);

    nSource[0] = cosaadd*cosdadd;
    nSource[1] = sinaadd*cosdadd;
    nSource[2] = sindadd;
					
    // adding signal to data (point by point)  								
    for (i=0; i<sett->N; i++) {
      shiftadd = 0.; 					 
      for (j=0; j<3; j++)
      	shiftadd += nSource[j]*ifo[n].sig.DetSSB[i*3+j];		 
      
      // Phase 
      phaseadd = sgnlo[0]*i + sgnlo[1]*aux_arr->t2[i] 
        + (cof + 2.*sgnlo[1]*i)*shiftadd
        - phaseshift; 

      // The whole signal with 4 amplitudes and modulations 
      signadd = sgnlo[4]*(sigaa[n][i])*cos(phaseadd) 
        + sgnlo[6]*(sigaa[n][i])*sin(phaseadd) 
        + sgnlo[5]*(sigbb[n][i])*cos(phaseadd) 
        + sgnlo[7]*(sigbb[n][i])*sin(phaseadd);

      //#mb test printout 
      //printf("%d %le\n", i + sett->N*(opts->ident-1), phaseadd); 

    
      // Adding the signal to the data vector 

      if(ifo[n].sig.xDat[i]) { 
        ifo[n].sig.xDat[i] += signadd;
	sum += pow(signadd, 2.);
//	       thsnr += pow(h0*signadd, 2.);

      }

	 
    }
    // Write the data+signal to file   
/*    FILE *dataout;
    char xxx[512]; 
    sprintf(xxx, "%s/%03d/%s/xdatc_%03d_%04d%s.bin",
          opts->dtaprefix, opts->ident, ifo[n].name, 
          opts->ident, opts->band, opts->label);
    printf("Flag 1: try to write xDat to fole %s\n", xxx);
    if((dataout = fopen(xxx, "wb")) != NULL) {
    	fwrite(ifo[n].sig.xDat, sizeof(*ifo[n].sig.xDat), sett->N, dataout);
    }
    else{
    	printf("Problem with %s file!\n", xxx);
    }
    fclose(dataout); */
    
  }
  h0 = (snr*sigma_noise)/(sqrt(sum));
  for(n=0; n<sett->nifo; n++) {
    for (i=0; i<sett->N; i++) {
      ifo[n].sig.xDat[i] = ifo[n].sig.xDat[i]*h0;
    }
  }
printf("%le %le\n", snr, h0);
for (i = 0; i < sett->nifo; i++) free(sigaa[i]);
free(sigaa);
for (i = 0; i < sett->nifo; i++) free(sigbb[i]);
free(sigbb);
//exit(0);
} 
コード例 #17
0
ファイル: umeyama.cpp プロジェクト: bengheng/Expose
int Umeyama(const gsl_matrix * const A,
            const gsl_matrix * const B,
            gsl_matrix * const Assignment,
            float *score)
{
	int res = 0;
	gsl_matrix_complex *AE = NULL, *BE = NULL;
	gsl_matrix	*P  = NULL,
			*AS = NULL,
			*BS = NULL,
			*AN = NULL,
			*BN = NULL,
			*AssignmentT = NULL;
	#ifdef USE_ASP
	long *col_mate;
	long *row_mate;
	cost **pTempCost;
	int i, j;
	#endif
	struct timeval start, end;
	long mtime, seconds, useconds;

	#ifdef VERBOSE
	PrintGSLMatrix(A, "Umeyama A");
	PrintGSLMatrix(B, "Umeyama B");
	#endif

	AE = gsl_matrix_complex_alloc(A->size1, A->size2);	if(AE == NULL) goto _exit;
	AS = gsl_matrix_alloc(A->size1, A->size2);		if(AS == NULL) goto _exit;
	AN = gsl_matrix_alloc(A->size1, A->size2);		if(AN == NULL) goto _exit;
	ComputeHermitianMatrix(A, AE, AS, AN);
	#ifdef VERBOSE
	PrintGSLMatrix(AS, "AS");
	PrintGSLMatrix(AN, "AN");
	#endif
	if( IsHermitian(AE) == false )
	{
		fprintf(stderr, "FATAL: AE is not Hermitian!\n");
		exit(0);
	}
	#ifdef VERBOSE
	fprintf(stderr, "Verified AE is Hermitian.\n");
	#endif

	BE = gsl_matrix_complex_alloc(B->size1, B->size2);	if(BE == NULL) goto _exit;
	BS = gsl_matrix_alloc(B->size1, B->size2);		if(BS == NULL) goto _exit;
	BN = gsl_matrix_alloc(B->size1, B->size2);		if(BN == NULL) goto _exit;
	ComputeHermitianMatrix(B, BE, BS, BN);
	#ifdef VERBOSE
	PrintGSLMatrix(BS, "BS");
	PrintGSLMatrix(BN, "BN");
	#endif
	if( IsHermitian(BE) == false )
	{
		fprintf(stderr, "FATAL: BE is not Hermitian!\n");
		exit(0);
	}
	#ifdef VERBOSE
	fprintf(stderr, "Verified BE is Hermitian.\n");
	WriteComplexMatrixToFile(BE);
	PrintGSLMatrixComplex(AE, "AE");
	PrintGSLMatrixComplex(BE, "BE");
	#endif
	
	P = gsl_matrix_alloc(A->size1, A->size2);		if(P == NULL) goto _exit;
	res = EigenDecomp(AE, BE, P);
	if( res == -1 ) goto _exit;
	#ifdef VERBOSE
	PrintGSLMatrix(P, "P");
	PrintGSLMatrix(P, "Computing Hungarian");
	#endif

	// Begin timing Hungarian
	gettimeofday(&start, NULL);
	#ifdef USE_ASP
	col_mate = new long[P->size1];
	row_mate = new long[P->size1];

	pTempCost = new cost*[P->size1];
	for(i = 0; i < P->size1; ++i)
		pTempCost[i] = new cost[P->size2];

	for(i = 0; i < P->size1; ++i)
		for(j = 0; j < P->size2; ++j)
			pTempCost[i][j] = gsl_matrix_get(P, i, j);

	asp(P->size1, pTempCost, col_mate, row_mate);

	for(i = 0; i < P->size1; ++i)
		delete[] pTempCost[i];
	delete[] pTempCost;

	// Update assignment matrix
	for(i = 0; i < P->size1; ++i)
		gsl_matrix_set(Assignment, i, col_mate[i], 1);

	delete[] col_mate;
	delete[] row_mate;

	#else
	Hungarian(P, true, Assignment);
	#endif
	// End timing Hungarian
	gettimeofday(&end, NULL);
	seconds = end.tv_sec - start.tv_sec;
	useconds = end.tv_usec - start.tv_usec;
	mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;
	fprintf(stderr, "%ld ms\t", mtime);

	// PrintGSLMatrixUint(Assignment, "Assignment");

	// Allocate and initialize AssgtT
	AssignmentT = gsl_matrix_alloc(Assignment->size1, Assignment->size2);
	if(AssignmentT == NULL) goto _exit;
	gsl_matrix_memcpy(AssignmentT, Assignment);
	gsl_matrix_transpose(AssignmentT);

	/*
	PrintGSLMatrix(AS, "AS");
	PrintGSLMatrix(AN, "AN");
	PrintGSLMatrix(BS, "BS");
	PrintGSLMatrix(BN, "BN");
	*/
	*score = CalcScore(AS, AN, BS, BN, Assignment, AssignmentT);

_exit:
	if(P != NULL)		gsl_matrix_free(P);
	if(AS != NULL)		gsl_matrix_free(AS);
	if(AN != NULL)		gsl_matrix_free(AN);
	if(BS != NULL)		gsl_matrix_free(BS);
	if(BN != NULL)		gsl_matrix_free(BN);
	if(AE != NULL)		gsl_matrix_complex_free(AE);
	if(BE != NULL)		gsl_matrix_complex_free(BE);
	if(AssignmentT != NULL)	gsl_matrix_free(AssignmentT);

	return res;
}
コード例 #18
0
ファイル: testgen2.c プロジェクト: BrianGladman/gsl
int
main(int argc, char *argv[])
{
  gen_workspace *gen_workspace_p;
  lapack_workspace *lapack_workspace_p;
  size_t N;
  int c;
  int lower;
  int upper;
  int incremental;
  size_t nmat;
  gsl_matrix *A, *B;
  gsl_rng *r;
  int s;
  int compute_schur;
  size_t i;

  gsl_ieee_env_setup();
  gsl_rng_env_setup();

  N = 30;
  lower = -10;
  upper = 10;
  incremental = 0;
  nmat = 0;
  compute_schur = 0;

  while ((c = getopt(argc, argv, "ic:n:l:u:z")) != (-1))
    {
      switch (c)
        {
          case 'i':
            incremental = 1;
            break;

          case 'n':
            N = strtol(optarg, NULL, 0);
            break;

          case 'l':
            lower = strtol(optarg, NULL, 0);
            break;

          case 'u':
            upper = strtol(optarg, NULL, 0);
            break;

          case 'c':
            nmat = strtoul(optarg, NULL, 0);
            break;

          case 'z':
            compute_schur = 1;
            break;

          case '?':
          default:
            printf("usage: %s [-i] [-z] [-n size] [-l lower-bound] [-u upper-bound] [-c num]\n", argv[0]);
            exit(1);
            break;
        } /* switch (c) */
    }

  A = gsl_matrix_alloc(N, N);
  B = gsl_matrix_alloc(N, N);
  gen_workspace_p = gen_alloc(N, compute_schur);
  lapack_workspace_p = lapack_alloc(N);

  r = gsl_rng_alloc(gsl_rng_default);

  if (incremental)
    {
      make_start_matrix(A, lower);

      /* we need B to be non-singular */
      make_random_integer_matrix(B, r, lower, upper);
    }

  fprintf(stderr, "testing N = %d", N);
  if (incremental)
    fprintf(stderr, " incrementally");
  else
    fprintf(stderr, " randomly");

  fprintf(stderr, " on element range [%d, %d]", lower, upper);

  if (compute_schur)
    fprintf(stderr, ", with Schur vectors");

  fprintf(stderr, "\n");

  while (1)
    {
      if (nmat && (count >= nmat))
        break;

      ++count;

      if (!incremental)
        {
          make_random_matrix(A, r, lower, upper);
          make_random_matrix(B, r, lower, upper);
        }
      else
        {
          s = inc_matrix(A, lower, upper);
          if (s)
            break; /* all done */

          make_random_integer_matrix(B, r, lower, upper);
        }

      /*if (count != 89120)
        continue;*/

      /* make copies of matrices */
      gsl_matrix_memcpy(gen_workspace_p->A, A);
      gsl_matrix_memcpy(gen_workspace_p->B, B);
      gsl_matrix_transpose_memcpy(lapack_workspace_p->A, A);
      gsl_matrix_transpose_memcpy(lapack_workspace_p->B, B);

      /* compute eigenvalues with LAPACK */
      s = lapack_proc(lapack_workspace_p);

      if (s != GSL_SUCCESS)
        {
          printf("LAPACK failed, case %lu\n", count);
          exit(1);
        }

#if 0
      print_matrix(A, "A");
      print_matrix(B, "B");
      gsl_matrix_transpose(lapack_workspace_p->A);
      gsl_matrix_transpose(lapack_workspace_p->B);
      print_matrix(lapack_workspace_p->A, "S_lapack");
      print_matrix(lapack_workspace_p->B, "T_lapack");
#endif

      /* compute eigenvalues with GSL */
      s = gen_proc(gen_workspace_p);

      if (s != GSL_SUCCESS)
        {
          printf("=========== CASE %lu ============\n", count);
          printf("Failed to converge: found %u eigenvalues\n",
                 gen_workspace_p->n_evals);
          print_matrix(A, "A");
          print_matrix(B, "B");
          print_matrix(gen_workspace_p->A, "Af");
          print_matrix(gen_workspace_p->B, "Bf");
          print_matrix(lapack_workspace_p->A, "Ae");
          print_matrix(lapack_workspace_p->B, "Be");
          exit(1);
        }

#if 0
      print_matrix(gen_workspace_p->A, "S_gsl");
      print_matrix(gen_workspace_p->B, "T_gsl");
#endif

      /* compute alpha / beta vectors */
      for (i = 0; i < N; ++i)
        {
          double beta;
          gsl_complex alpha, z;

          beta = gsl_vector_get(gen_workspace_p->beta, i);
          if (beta == 0.0)
            GSL_SET_COMPLEX(&z, GSL_POSINF, GSL_POSINF);
          else
            {
              alpha = gsl_vector_complex_get(gen_workspace_p->alpha, i);
              z = gsl_complex_div_real(alpha, beta);
            }

          gsl_vector_complex_set(gen_workspace_p->evals, i, z);

          beta = gsl_vector_get(lapack_workspace_p->beta, i);
          GSL_SET_COMPLEX(&alpha,
                          lapack_workspace_p->alphar[i],
                          lapack_workspace_p->alphai[i]);

          if (beta == 0.0)
            GSL_SET_COMPLEX(&z, GSL_POSINF, GSL_POSINF);
          else
            z = gsl_complex_div_real(alpha, beta);

          gsl_vector_complex_set(lapack_workspace_p->evals, i, z);
          gsl_vector_complex_set(lapack_workspace_p->alpha, i, alpha);
        }

#if 0
      gsl_sort_vector(gen_workspace_p->beta);
      gsl_sort_vector(lapack_workspace_p->beta);
      sort_complex_vector(gen_workspace_p->alpha);
      sort_complex_vector(lapack_workspace_p->alpha);

      s = test_alpha(gen_workspace_p->alpha,
                     lapack_workspace_p->alpha,
                     A,
                     B,
                     "gen",
                     "lapack");
      s = test_beta(gen_workspace_p->beta,
                    lapack_workspace_p->beta,
                    A,
                    B,
                    "gen",
                    "lapack");
#endif
#if 1
      sort_complex_vector(gen_workspace_p->evals);
      sort_complex_vector(lapack_workspace_p->evals);

      s = test_evals(gen_workspace_p->evals,
                     lapack_workspace_p->evals,
                     A,
                     B,
                     "gen",
                     "lapack");
#endif

      if (compute_schur)
        {
          test_schur(A,
                     gen_workspace_p->A,
                     gen_workspace_p->Q,
                     gen_workspace_p->Z);
          test_schur(B,
                     gen_workspace_p->B,
                     gen_workspace_p->Q,
                     gen_workspace_p->Z);
        }
    }

  gsl_matrix_free(A);
  gsl_matrix_free(B);
  gen_free(gen_workspace_p);
  lapack_free(lapack_workspace_p);

  if (r)
    gsl_rng_free(r);

  return 0;
} /* main() */