예제 #1
0
파일: test.c 프로젝트: lemahdi/mglib
void
test_eigen_symm_matrix(const gsl_matrix * m, size_t count,
                       const char * desc)
{
  const size_t N = m->size1;
  gsl_matrix * A = gsl_matrix_alloc(N, N);
  gsl_vector * eval = gsl_vector_alloc(N);
  gsl_vector * evalv = gsl_vector_alloc(N);
  gsl_vector * x = gsl_vector_alloc(N);
  gsl_vector * y = gsl_vector_alloc(N);
  gsl_matrix * evec = gsl_matrix_alloc(N, N);
  gsl_eigen_symm_workspace * w = gsl_eigen_symm_alloc(N);
  gsl_eigen_symmv_workspace * wv = gsl_eigen_symmv_alloc(N);

  gsl_matrix_memcpy(A, m);

  gsl_eigen_symmv(A, evalv, evec, wv);
  test_eigen_symm_results(m, evalv, evec, count, desc, "unsorted");

  gsl_matrix_memcpy(A, m);

  gsl_eigen_symm(A, eval, w);

  /* sort eval and evalv */
  gsl_vector_memcpy(x, eval);
  gsl_vector_memcpy(y, evalv);
  gsl_sort_vector(x);
  gsl_sort_vector(y);
  test_eigenvalues_real(y, x, desc, "unsorted");

  gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_ASC);
  test_eigen_symm_results(m, evalv, evec, count, desc, "val/asc");

  gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_VAL_DESC);
  test_eigen_symm_results(m, evalv, evec, count, desc, "val/desc");

  gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_ASC);
  test_eigen_symm_results(m, evalv, evec, count, desc, "abs/asc");

  gsl_eigen_symmv_sort(evalv, evec, GSL_EIGEN_SORT_ABS_DESC);
  test_eigen_symm_results(m, evalv, evec, count, desc, "abs/desc");

  gsl_matrix_free(A);
  gsl_vector_free(eval);
  gsl_vector_free(evalv);
  gsl_vector_free(x);
  gsl_vector_free(y);
  gsl_matrix_free(evec);
  gsl_eigen_symm_free(w);
  gsl_eigen_symmv_free(wv);
} /* test_eigen_symm_matrix() */
예제 #2
0
int main(int argc, char *argv[])
{
  const size_t NDIM = 3;
  double data[NDIM * NDIM];
  gsl_matrix_view m = gsl_matrix_view_array(data, NDIM, NDIM);
  gsl_vector *eval = gsl_vector_alloc (NDIM);
  gsl_matrix *evec = gsl_matrix_alloc (NDIM, NDIM);
  gsl_eigen_symmv_workspace * w = 
    gsl_eigen_symmv_alloc (NDIM);
  gsl_eigen_symmv (&m.matrix, eval, evec, w);
  gsl_eigen_symmv_free (w);
  //Sort Eigenvalues in ascending order
  gsl_eigen_symmv_sort (eval, evec, 
			GSL_EIGEN_SORT_VAL_ASC);
  
//  for (size_t i = 0; i < NDIM; i++)
//    {
//      retVal.EigenVal[i] = gsl_vector_get(eval, i) / range->size();
//
//      gsl_vector_view evec_i 
//	= gsl_matrix_column (evec, i);
//
//      //EigenVec Components
//      for (size_t j = 0; j < NDIM; j++)
//	retVal.EigenVec[i][j] = gsl_vector_get(&evec_i.vector, j);
//    }

  //Cleanup GSL
  gsl_vector_free (eval);
  gsl_matrix_free (evec);
}
예제 #3
0
void Geo3d_Cov_Orientation(double *cov, double *vec, double *ext)
{
#ifdef HAVE_LIBGSL
  gsl_matrix_view gmv = gsl_matrix_view_array(cov, 3, 3);
  
  gsl_vector *eval = gsl_vector_alloc(3);
  gsl_matrix *evec = gsl_matrix_alloc(3,3);
  gsl_eigen_symmv_workspace *w = gsl_eigen_symmv_alloc(3);

  gsl_eigen_symmv(&(gmv.matrix), eval, evec, w);
  gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_DESC);

  if(ext != NULL) {
    darraycpy(ext, gsl_vector_const_ptr(eval, 0), 0, 3);
  }

  gsl_vector_view v = gsl_vector_view_array(vec, 3);
  gsl_matrix_get_col(&(v.vector), evec, 0);

  gsl_vector_free(eval);
  gsl_matrix_free(evec);
  gsl_eigen_symmv_free(w); 
#else
  double eigv[3];
  Matrix_Eigen_Value_Cs(cov[0], cov[4], cov[8], cov[1], cov[2], cov[5], eigv);
  Matrix_Eigen_Vector_Cs(cov[0], cov[4], cov[8], cov[1], cov[2], cov[5], 
      eigv[0], vec);
  if(ext != NULL) {
    darraycpy(ext, eigv, 0, 3);
  }
#endif
}
void find_eigens2(gsl_matrix *m, gsl_vector *eval,gsl_matrix *evec)
{

  gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (3);
  
  gsl_eigen_symmv (m, eval, evec, w);
  
  gsl_eigen_symmv_free (w);
  
  gsl_eigen_symmv_sort (eval, evec,GSL_EIGEN_SORT_ABS_ASC);
  
  {
	int i;
    
    for (i = 0; i < 3; i++)
      {
		double eval_i= gsl_vector_get (eval, i);
		gsl_vector_view evec_i= gsl_matrix_column (evec, i);

		
		gsl_vector_fprintf (stdout,&evec_i.vector, "%g");
      }
  }
  
  gsl_vector_free (eval);
  gsl_matrix_free (evec);

}
예제 #5
0
 void eig (Matrix& src, double* evals, Matrix& evec)
 {
   gsl_eigen_symmv (src.get_gsl_matrix(), eigen_values, evec.get_gsl_matrix(), eigv_work);
   gsl_eigen_symmv_sort (eigen_values, evec.get_gsl_matrix(), GSL_EIGEN_SORT_VAL_ASC);
   for (guint i = 0; i < src.rows(); i++)
     evals[i] = gsl_vector_get (eigen_values, i);
 }
예제 #6
0
void eigensolve(vector vec1, vector vec2, vector vec3,
		real *vals, matrix symmat)
{
  int i, j;
  double data[9];
  gsl_matrix_view mat;
  gsl_vector_view vec;
  gsl_vector *eigval = gsl_vector_alloc(3);
  gsl_matrix *eigvec = gsl_matrix_alloc(3, 3);
  gsl_eigen_symmv_workspace *work = gsl_eigen_symmv_alloc(3);

  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
      data[3*i + j] = symmat[i][j];
  mat = gsl_matrix_view_array(data, 3, 3);
  gsl_eigen_symmv(&mat.matrix, eigval, eigvec, work);
  gsl_eigen_symmv_free(work);
  gsl_eigen_symmv_sort(eigval, eigvec, GSL_EIGEN_SORT_VAL_DESC);
  for (i = 0; i < 3; i++)
    vals[i] = gsl_vector_get(eigval, i);
  vec = gsl_matrix_column(eigvec, 0);
  for (i = 0; i < 3; i++)
    vec1[i] = gsl_vector_get(&vec.vector, i);
  vec = gsl_matrix_column(eigvec, 1);
  for (i = 0; i < 3; i++)
    vec2[i] = gsl_vector_get(&vec.vector, i);
  vec = gsl_matrix_column(eigvec, 2);
  for (i = 0; i < 3; i++)
    vec3[i] = gsl_vector_get(&vec.vector, i);
  gsl_vector_free(eigval);
  gsl_matrix_free(eigvec);
}
예제 #7
0
파일: egsl_ops.c 프로젝트: AndreaCensi/csm
void egsl_symm_eig(val v, double* eigenvalues, val* eigenvectors) {
	gsl_matrix *m = egsl_gslm(v);
	size_t N = m->size1;
	/* Check for v to be square */
	
	gsl_matrix *A = gsl_matrix_alloc(N,N);
	gsl_matrix_memcpy(A, m);
	
	gsl_vector *eval = gsl_vector_alloc(N); 
	gsl_matrix *evec = gsl_matrix_alloc(N,N);
	
	gsl_eigen_symmv_workspace * ws = gsl_eigen_symmv_alloc(N);
	gsl_eigen_symmv(A, eval, evec, ws);
	gsl_eigen_symmv_free(ws);	

	
	gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_VAL_DESC);
	
	size_t j;
	for(j=0;j<N;j++) {
		eigenvalues[j] = gsl_vector_get(eval, j);
		eigenvectors[j] = egsl_alloc(N,1);
		size_t i;
		for(i=0;i<N;i++)
			*egsl_atmp(eigenvectors[j],i,0) = gsl_matrix_get(evec,i,j);
	}
	
	
	gsl_vector_free(eval);	
	gsl_matrix_free(evec);
	gsl_matrix_free(A);
}
int Schrodinger_Solve(double dx, int Dim, int barrier_L, int barrier_R, double E_well, double *Meff_ptr, double *subband_ptr,
gsl_eigen_symmv_workspace *Workspace, gsl_matrix *Hamil_ptr, gsl_vector *Eigvalue_ptr, gsl_matrix *Eigvector_ptr,
gsl_vector *s_eigvector_ptr, gsl_vector *Potential_ptr, gsl_matrix *Norm_Eigvector_ptr, FILE *fp_1, FILE *fp_2 ){
    int n, m, N=0;
    double Hbar=1.054571E-34, Element;
    double t_0=(Hbar*Hbar)/(2*dx*dx);
    for (n = 0; n < Dim; n++)
    {
        for (m = 0; m < Dim; m++)
        {
            if (n == m) /*main diagonal*/
            {
                Element = t_0/Meff_ptr[n-1] + t_0/Meff_ptr[n+1] + gsl_vector_get(Potential_ptr, n);
            }
            else if (n == m-1) /*subdiagonal*/
            {
                Element = -1*t_0/Meff_ptr[n-1];
            }
            else if (n == m+1) /*superdiagonal*/
            {
                Element = -1*t_0/Meff_ptr[n+1];
            }
            else
            {
                Element = 0;
                /*all other matrix elements*/
            }
            gsl_matrix_set(Hamil_ptr, n, m, Element);
            /*transfer value to matrix*/
        }
    }
    gsl_eigen_symmv(Hamil_ptr, Eigvalue_ptr, Eigvector_ptr, Workspace);
    /*solve matrix*/
    gsl_eigen_symmv_sort(Eigvalue_ptr, Eigvector_ptr, GSL_EIGEN_SORT_VAL_ASC);
    /*re-order the results in ascending order*/
    /*output eigenvalues*/
    for (n = 0; n < Dim; n++){
        double eigenvalue = gsl_vector_get(Eigvalue_ptr, n);
        if (eigenvalue>E_well && eigenvalue<0) /*select confined states*/
        {
            fprintf(fp_1, "n%E", (eigenvalue/1.6E-22));
            /*output in meV*/
            subband_ptr[n] = eigenvalue; /*For Fermi-Dirac */
            N = N+1;
            /* sum the number of eigenstates*/
        }
    }
    /*output eigenvectors*/
    for (n = 0; n < N; n++){  /*retrieve eigenvectors for confined states only*/
        fprintf(fp_2, "nnnn");
        gsl_matrix_get_col(s_eigvector_ptr, Eigvector_ptr, n);
        /*retrieve nth eigenvector*/
        Normalise(s_eigvector_ptr, Dim, dx, fp_2);
        /*normalise eigenvector*/
        gsl_matrix_set_col(Norm_Eigvector_ptr, n, s_eigvector_ptr);
    }
    return N;
}
/* compute evals and evecs of symmetric matrix */
void compute_evals_and_evecs_of_symm_matrix(gsl_matrix *M, gsl_vector *eval, gsl_matrix *evec){
    gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (M->size1);

    gsl_eigen_symmv (M, eval, evec, w);

    gsl_eigen_symmv_free(w);

    gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);
}
예제 #10
0
void eigen(double * dataPtr, int n, gsl_vector *eval, gsl_matrix *evec)
// dataPtr points to n*n matrix, contigues storage
{
	gsl_matrix_view m = gsl_matrix_view_array (dataPtr, n, n);
	gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (n);
	gsl_eigen_symmv (&m.matrix, eval, evec, w);
	gsl_eigen_symmv_free (w);
	gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);
} // eigen
예제 #11
0
파일: sort.c 프로젝트: Julio-Anjos/gsl
int
gsl_eigen_gensymmv_sort (gsl_vector * eval, gsl_matrix * evec, 
                         gsl_eigen_sort_t sort_type)
{
  int s;

  s = gsl_eigen_symmv_sort(eval, evec, sort_type);

  return s;
}
예제 #12
0
파일: util.c 프로젝트: alvarouc/ica_gsl
void gsl_eig(gsl_matrix *sym, gsl_vector *eval, gsl_matrix *evec ,size_t NCOMP){
  //Compute eigen values with GSL
  size_t NSUB = sym->size1;
  gsl_eigen_symmv_workspace *w = gsl_eigen_symmv_alloc(NSUB);
  gsl_eigen_symmv(sym, eval, evec, w);
  gsl_eigen_symmv_free(w);
  gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_DESC);
  gsl_matrix_view temp = gsl_matrix_submatrix(sym, 0,0 , NSUB, NCOMP);
  gsl_matrix_memcpy(evec,&temp.matrix);
}
예제 #13
0
파일: PCA.c 프로젝트: napean/Compufis
int get_eigen (gsl_matrix* m,gsl_vector* eval, gsl_matrix* evec, int n)
{
  gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (n);
  
  gsl_eigen_symmv (m, eval, evec, w);
  
  gsl_eigen_symmv_free (w);
  
  gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);

return 0;
}
예제 #14
0
파일: mnormal.c 프로젝트: rforge/lnar
double ldmvnorm(const int n, const gsl_vector *x, const gsl_vector *mean, const gsl_matrix *var){
    /* log-multivariate normal density function    */
    /*
     *	n	dimension of the random vetor
     *	mean	vector of means of size n
     *	var	variance matrix of dimension n x n
     */
    int s;
    double ax,ay;
    gsl_vector *ym, *xm;
    gsl_matrix *work = gsl_matrix_alloc(n,n), 
	                  *winv = gsl_matrix_alloc(n,n);
#ifdef PRINTSTIFF
    /* Print Stiffness indicator S=max(eigen)/min(eigen)*/
    gsl_vector *eval = gsl_vector_alloc (n);
    gsl_matrix *evec = gsl_matrix_alloc (n, n);
    gsl_matrix_memcpy(work,var);
    gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc(n);
    gsl_eigen_symmv (work, eval, evec, w);
    gsl_eigen_symmv_free (w);
    gsl_eigen_symmv_sort (eval, evec, 
	    GSL_EIGEN_SORT_ABS_ASC);
    printf("%f ",
	    gsl_vector_get(eval,n-1) / gsl_vector_get(eval,0));
    gsl_vector_free(eval);
    gsl_matrix_free(evec);
#endif

    gsl_permutation *p = gsl_permutation_alloc(n);
    gsl_matrix_memcpy( work, var );
    gsl_linalg_LU_decomp( work, p, &s );
    gsl_linalg_LU_invert( work, p, winv );
    ax = gsl_linalg_LU_det( work, s );
    gsl_matrix_free( work );
    gsl_permutation_free( p );

    xm = gsl_vector_alloc(n);
    gsl_vector_memcpy( xm, x);
    gsl_vector_sub( xm, mean );
    ym = gsl_vector_alloc(n);
    gsl_blas_dsymv(CblasUpper,1.0,winv,xm,0.0,ym);
    gsl_matrix_free( winv );
    gsl_blas_ddot( xm, ym, &ay);
    gsl_vector_free(xm);
    gsl_vector_free(ym);
    /* 
     * ay = exp(-0.5*ay)/sqrt( pow((2*M_PI),n)*ax );
     */
    ay = -0.5*( ay + n*log(2*M_PI) + log(ax) );
    return ay;
}
예제 #15
0
파일: util.c 프로젝트: alvarouc/ica_gsl
void dc_eig(gsl_matrix *sym, gsl_vector *eval, gsl_matrix *evec ,size_t NCOMP){
  // Divide and conquer Eigen decomposition
  // gsl_matrix *evec = gsl_matrix_alloc(NSUB, NSUB);
  // gsl_vector *eval = gsl_vector_alloc(NCOMP); //eigen values
  size_t NSUB = sym->size1;
  gsl_vector *eval_temp =gsl_vector_alloc(NSUB);
  LAPACKE_dsyevd(LAPACK_ROW_MAJOR, 'V', 'U',
    NSUB, sym->data, NSUB, eval_temp->data);
  gsl_eigen_symmv_sort (eval_temp, sym, GSL_EIGEN_SORT_ABS_DESC);
  gsl_matrix_view temp = gsl_matrix_submatrix(sym, 0,0 , NSUB, NCOMP);
  gsl_matrix_memcpy(evec,&temp.matrix);
  gsl_vector_view temp_vec = gsl_vector_subvector(eval_temp, 0, NCOMP);
  gsl_vector_memcpy(eval, &temp_vec.vector);
  gsl_vector_free(eval_temp);
}
예제 #16
0
  bool eigenValuesVectorsRealSym(const Matrix &m, Matrix& eigenvalues, Matrix& eigenvectors){
    // check if m is square
    assert(m.getM() == m.getN());
    gsl_matrix* m_gsl = toGSL(m); 

    gsl_eigen_symmv_workspace* w = gsl_eigen_symmv_alloc (m.getM());    
    gsl_vector *eval = gsl_vector_alloc (m.getM());
    gsl_matrix *evec = gsl_matrix_alloc (m.getM(), m.getM());
     
    gsl_eigen_symmv (m_gsl, eval, evec, w);     
    gsl_eigen_symmv_free (w);     
    gsl_eigen_symmv_sort (eval, evec, 
                          GSL_EIGEN_SORT_ABS_DESC);
    eigenvalues = fromGSL(eval);
    eigenvectors = fromGSL(evec);
    return true;
  }
예제 #17
0
파일: eigen.c 프로젝트: lemahdi/mglib
int
main (void)
{
  double data[] = { 1.0  , 1/2.0, 1/3.0, 1/4.0,
                    1/2.0, 1/3.0, 1/4.0, 1/5.0,
                    1/3.0, 1/4.0, 1/5.0, 1/6.0,
                    1/4.0, 1/5.0, 1/6.0, 1/7.0 };

  gsl_matrix_view m 
    = gsl_matrix_view_array (data, 4, 4);

  gsl_vector *eval = gsl_vector_alloc (4);
  gsl_matrix *evec = gsl_matrix_alloc (4, 4);

  gsl_eigen_symmv_workspace * w = 
    gsl_eigen_symmv_alloc (4);
  
  gsl_eigen_symmv (&m.matrix, eval, evec, w);

  gsl_eigen_symmv_free (w);

  gsl_eigen_symmv_sort (eval, evec, 
                        GSL_EIGEN_SORT_ABS_ASC);
  
  {
    int i;

    for (i = 0; i < 4; i++)
      {
        double eval_i 
           = gsl_vector_get (eval, i);
        gsl_vector_view evec_i 
           = gsl_matrix_column (evec, i);

        printf ("eigenvalue = %g\n", eval_i);
        printf ("eigenvector = \n");
        gsl_vector_fprintf (stdout, 
                            &evec_i.vector, "%g");
      }
  }

  gsl_vector_free (eval);
  gsl_matrix_free (evec);

  return 0;
}
예제 #18
0
  void multi_gauss::generate_eigenvectors(double **covar_matrix,
					  double scale_used){

    scale = scale_used;
    size_t size_used=size;
    double value;
    double *tempArray;
    tempArray = new double[size*size];
    int k=0;
    for(int i=0;i<size_used;++i){
      for(int j=0;j<size_used;++j){
        tempArray[k]=covar_matrix[i][j];
        k++;
      }
    }

    //From GNU Scientific Library
    gsl_eigen_symmv_workspace *w = gsl_eigen_symmv_alloc(size_used);
    gsl_matrix_view m = gsl_matrix_view_array(tempArray,size_used,size_used);
    
    // ordering of rows and columns is irrelevant, as this is a symmetric matrix.
    gsl_vector *eval = gsl_vector_alloc(size_used);
    gsl_matrix *evec = gsl_matrix_alloc(size_used, size_used);

    // obtain eigenvalues and eigenvectors
    gsl_eigen_symmv (&m.matrix, eval, evec, w); 
    gsl_eigen_symmv_free(w);

    // sort in ascending order (not strictly neccessary)
    gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_ASC);  
    
    for(int i=0;i<size_used;++i) {
      // copy into the class member variables.
      eigenvalues[i] = gsl_vector_get (eval, i);
      for (int j=0;j<size_used;++j){
        value=gsl_matrix_get(evec,i,j);
        master_matrix[i][j]=value;
      }
    }

    for(int i=0;i<size_used;++i) eigenvalues[i] *= scale;
    
    gsl_vector_free(eval);  
    gsl_matrix_free(evec);
    delete[] tempArray;
  }
예제 #19
0
/**
 * Empirical Orthogonal Functions analysis (or Principal Component Analysis)
 * of a multivariate time series.
 * \param[in]  data Multivariate time series on which to perform the analysis.
 * \param[out] w    Eigenvalues of the covariance matrix giving the explained variance.
 * \param[out] E    Matrix with an Empirical Orthogonal Function for each column.
 * \param[out] A    Matrix with a principal component for each column.
 */
void
getEOF(const gsl_matrix *data, gsl_vector *w, gsl_matrix *E, gsl_matrix *A)
{
    size_t nt = data->size1;
    size_t N = data->size2;
    gsl_vector *mean;
    gsl_matrix *C = gsl_matrix_alloc(N, N);
    gsl_eigen_symmv_workspace *work = gsl_eigen_symmv_alloc(N);
    gsl_matrix *X = gsl_matrix_alloc(data->size1, data->size2);
    gsl_matrix_memcpy(X, data);
    gsl_vector_view col;

    // Get anomalies
    A = gsl_matrix_alloc(nt, N);
    gsl_matrix_memcpy(A, X);
    mean = gsl_vector_alloc(N);
    gsl_matrix_get_mean(mean, A, 0);
    for (size_t j = 0; j < X->size2; j++)
    {
        col = gsl_matrix_column(X, j);
        gsl_vector_add_constant(&col.vector, - gsl_vector_get(mean, j));
    }

    // Get correlation matrix
    gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1., A, A, 0., C);
    gsl_matrix_scale(C, 1. / nt);

    // Solve eigen problem and sort by descending magnitude
    gsl_eigen_symmv(C, w, E, work);
    gsl_eigen_symmv_sort(w, E, GSL_EIGEN_SORT_VAL_DESC);

    // Get principal components
    gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1., X, E, 0., A);

    // Free
    gsl_eigen_symmv_free(work);
    gsl_matrix_free(C);

    return;
}
예제 #20
0
/**
 * Determine a direction vector from the orientation matrix.
 *
 * NOTE: vec should be *initialized* to be a unit vector -- its value is used,
 * then replaced
 */
int XLALSimInspiralOrientationMatrixDirection(
				REAL8 vec[3], /**< 3 dim unit vector, modified in place */
				REAL8 mtx[3][3] /**< 3x3 orientation matrix */
) {
		REAL8 vecLast[3];
		gsl_matrix *m = gsl_matrix_alloc(3,3);
		gsl_vector *eval = gsl_vector_alloc(3);
		gsl_matrix *evec = gsl_matrix_alloc(3,3);
		gsl_eigen_symmv_workspace  *w = gsl_eigen_symmv_alloc(3);
		int i,j;

		vecLast[0] = vec[0];
		vecLast[1] = vec[1];
		vecLast[2]=vec[2];
		for (i=0; i<3; i++) {
				for (j=0; j<3; j++) {
						gsl_matrix_set(m,i,j,mtx[i][j]);
				}
		}
		gsl_eigen_symmv(m, eval, evec, w);
		gsl_eigen_symmv_free(w);

		gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_ABS_ASC);  

		for (i=0; i<3; i++) {
				vec[i] = gsl_matrix_get(evec,2,i);
		}

		if (vecLast[0]*vec[0] + vecLast[1]*vec[1] + vecLast[2]*vec[2] <0) {
				for (i=0; i<3; i++) {
						vec[i] =  - vec[i];
				}
		}

		gsl_vector_free(eval);
		gsl_matrix_free(evec);

		return XLAL_SUCCESS;
}
예제 #21
0
void 
Matrix33::Eigen( std::vector<real>& Eval, std::vector<Vector3>& Evec ) const {
  //  std::cout << " in Eigen()..." << std::endl;
  gsl_matrix_view m = gsl_matrix_view_array( data_, 3, 3 );
  gsl_vector *eval = gsl_vector_alloc ( 3 );
  gsl_matrix *evec = gsl_matrix_alloc ( 3, 3 );
  gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc ( 3 );

  gsl_eigen_symmv ( &m.matrix, eval, evec, w );
  gsl_eigen_symmv_free ( w );
  //gsl_eigen_symmv_sort ( eval, evec, GSL_EIGEN_SORT_ABS_ASC );
  gsl_eigen_symmv_sort ( eval, evec, GSL_EIGEN_SORT_VAL_ASC );

  for ( unsigned i = 0; i < 3; ++i ) {
    //double eval_i = gsl_vector_get (eval, i);
    gsl_vector_view evec_i = gsl_matrix_column (evec, i);
    Eval.at(i) = gsl_vector_get ( eval, i );
		
    for ( unsigned j = 0; j < 3; ++j ){
      (Evec.at(i))(j) = gsl_vector_get( &evec_i.vector, j );
    }
  }
}
예제 #22
0
static void solve_u_v(double d[3], double u[3], double v[3]) {
    double data[9] = {
        d[0] * d[0], d[1] * d[0], d[2] * d[0],
        d[0] * d[1], d[1] * d[1], d[2] * d[1],
        d[0] * d[2], d[1] * d[2], d[2] * d[2],
    };
    gsl_matrix_view m = gsl_matrix_view_array(data, 3, 3);
    gsl_vector * eval = gsl_vector_alloc(3);
    gsl_matrix * evac = gsl_matrix_alloc(3, 3);
    gsl_eigen_symmv_workspace * work = gsl_eigen_symmv_alloc(3);
    gsl_eigen_symmv(&m.matrix, eval, evac, work);
    gsl_eigen_symmv_sort(eval, evac, GSL_EIGEN_SORT_ABS_ASC);
    gsl_vector_view u_view = gsl_matrix_column(evac, 0);
    gsl_vector_view v_view = gsl_matrix_column(evac, 1);
    int i;
    for(i = 0; i < 3; i++) {
        u[i] = gsl_vector_get(&u_view.vector, i);
        v[i] = gsl_vector_get(&v_view.vector, i);
    }
    gsl_matrix_free(evac);
    gsl_vector_free(eval);
    gsl_eigen_symmv_free(work);
}
예제 #23
0
void alignMesh( Polyhedron & poly )
{
    int num = poly.size_of_vertices();

    // initialization here is very important!!
    Point3 ave( 0.0, 0.0, 0.0 );
    for ( Vertex_iterator vi = poly.vertices_begin(); vi != poly.vertices_end(); ++vi ) {
	ave = ave + ( vi->point() - CGAL::ORIGIN );
    }
    ave = CGAL::ORIGIN + ( ave - CGAL::ORIGIN )/( double )num;

    unsigned int dim	= 3;
    double * data	= new double [ num*dim ];

    int nPoints = 0;
    for ( Vertex_iterator vi = poly.vertices_begin(); vi != poly.vertices_end(); ++vi ) {
	data[ nPoints * dim + 0 ] = vi->point().x() - ave.x();
	data[ nPoints * dim + 1 ] = vi->point().y() - ave.y();
	data[ nPoints * dim + 2 ] = vi->point().z() - ave.z();
	nPoints++;
    }

    assert( nPoints == ( int )num );

    /*****************************************
      analyze the engenstructure of X^T X
     *****************************************/
    /* define the matrix X */
    gsl_matrix_view X = gsl_matrix_view_array( data, num, dim );

    /* memory reallocation */
    // proj = ( double * )realloc( proj, sizeof( double ) * PDIM * num );

    /* calculate the covariance matrix B */
    gsl_matrix * B              = gsl_matrix_alloc( dim, dim );
    gsl_blas_dgemm( CblasTrans, CblasNoTrans, 1.0,
                    &(X.matrix),
                    &(X.matrix), 0.0,
                    B );
       
    /* divided by the number of samples */
    gsl_matrix_scale( B, 1.0/(double)num );

    gsl_vector * eVal       = gsl_vector_alloc( dim );
    gsl_matrix * eVec       = gsl_matrix_alloc( dim, dim );
    gsl_eigen_symmv_workspace * w
                                = gsl_eigen_symmv_alloc( dim );

    // eigenanalysis of the matrix B
    gsl_eigen_symmv( B, eVal, eVec, w );
    // release the memory of w
    gsl_eigen_symmv_free( w );
    // sort eigenvalues in a descending order
    gsl_eigen_symmv_sort( eVal, eVec, GSL_EIGEN_SORT_VAL_DESC );

    // #ifdef MYDEBUG
    for ( unsigned int i = 0; i < dim; ++i ) {
	cerr << "Eigenvalue No. " << i << " = " << gsl_vector_get( eVal, i ) << endl;
	cerr << "Eigenvector No. " << i << endl;
	double length = 0.0;
	for ( unsigned int j = 0; j < dim; ++j ) {
	    cerr << gsl_matrix_get( eVec, i, j ) << " ";
	    length += gsl_matrix_get( eVec, i, j )*gsl_matrix_get( eVec, i, j );
	}
	cerr << " length = " << length << endl;
    }
    // #endif	// MYDEBUG

    // 0 1 2, 0 2 1, 
    

    Transformation3 map;
    map = 
	Transformation3( gsl_matrix_get(eVec,1,0), gsl_matrix_get(eVec,0,0), gsl_matrix_get(eVec,2,0),
			 gsl_matrix_get(eVec,1,1), gsl_matrix_get(eVec,0,1), gsl_matrix_get(eVec,2,1),
			 gsl_matrix_get(eVec,1,2), gsl_matrix_get(eVec,0,2), gsl_matrix_get(eVec,2,2) );
    if ( map.is_odd() ) {
	cerr << " Transformation matrix reflected" << endl;
	map = 
	    Transformation3( gsl_matrix_get(eVec,1,0), gsl_matrix_get(eVec,0,0), -gsl_matrix_get(eVec,2,0),
			     gsl_matrix_get(eVec,1,1), gsl_matrix_get(eVec,0,1), -gsl_matrix_get(eVec,2,1),
			     gsl_matrix_get(eVec,1,2), gsl_matrix_get(eVec,0,2), -gsl_matrix_get(eVec,2,2) );
    }

    for ( unsigned int i = 0; i < dim; ++i ) {
	cerr << "| ";
	for ( unsigned int j = 0; j < dim; ++j ) {
	    cerr << map.cartesian( i, j ) << " ";
	}
	cerr << "|" << endl;
    }

    transformMesh( poly, map );

    return;
}
예제 #24
0
//------------------------------------------------------------------------------
//	Align the mesh
//------------------------------------------------------------------------------
Vector3 principalAxis( Polyhedron & poly )
{
    int num = poly.size_of_vertices();

    // initialization here is very important!!
    Point3 ave( 0.0, 0.0, 0.0 );
    for ( Vertex_iterator vi = poly.vertices_begin(); vi != poly.vertices_end(); ++vi ) {
	ave = ave + ( vi->point() - CGAL::ORIGIN );
    }
    ave = CGAL::ORIGIN + ( ave - CGAL::ORIGIN )/( double )num;

    unsigned int dim	= 3;
    double * data	= new double [ num*dim ];

    int nPoints = 0;
    for ( Vertex_iterator vi = poly.vertices_begin(); vi != poly.vertices_end(); ++vi ) {
	data[ nPoints * dim + 0 ] = vi->point().x() - ave.x();
	data[ nPoints * dim + 1 ] = vi->point().y() - ave.y();
	data[ nPoints * dim + 2 ] = vi->point().z() - ave.z();
	nPoints++;
    }

    assert( nPoints == ( int )num );

    /*****************************************
      analyze the engenstructure of X^T X
     *****************************************/
    /* define the matrix X */
    gsl_matrix_view X = gsl_matrix_view_array( data, num, dim );

    /* memory reallocation */
    // proj = ( double * )realloc( proj, sizeof( double ) * PDIM * num );

    /* calculate the covariance matrix B */
    gsl_matrix * B              = gsl_matrix_alloc( dim, dim );
    gsl_blas_dgemm( CblasTrans, CblasNoTrans, 1.0,
                    &(X.matrix),
                    &(X.matrix), 0.0,
                    B );
       
    /* divided by the number of samples */
    gsl_matrix_scale( B, 1.0/(double)num );

    gsl_vector * eVal       = gsl_vector_alloc( dim );
    gsl_matrix * eVec       = gsl_matrix_alloc( dim, dim );
    gsl_eigen_symmv_workspace * w
                                = gsl_eigen_symmv_alloc( dim );

    // eigenanalysis of the matrix B
    gsl_eigen_symmv( B, eVal, eVec, w );
    // release the memory of w
    gsl_eigen_symmv_free( w );
    // sort eigenvalues in a descending order
    gsl_eigen_symmv_sort( eVal, eVec, GSL_EIGEN_SORT_VAL_DESC );

#ifdef MYDEBUG
    for ( unsigned int i = 0; i < dim; ++i ) {
	cerr << "Eigenvalue No. " << i << " = " << gsl_vector_get( eVal, i ) << endl;
	cerr << "Eigenvector No. " << i << endl;
	for ( unsigned int j = 0; j < dim; ++j ) {
	    length += gsl_matrix_get( eVec, i, j )*gsl_matrix_get( eVec, i, j );
	}
	cerr << " length = " << length << endl;
    }
#endif	// MYDEBUG

    Vector3 ref( gsl_matrix_get( eVec, 0, 0 ),
		 gsl_matrix_get( eVec, 0, 1 ),
		 gsl_matrix_get( eVec, 0, 2 ) );
    return ref;

#ifdef DEBUG
    gsl_vector_view eachVec = gsl_matrix_column( eigenVec, 0 );
    double cosRot = gsl_matrix_get( eigenVec, 0, 1 );
    double sinRot = gsl_matrix_get( eigenVec, 1, 1 );
#ifdef DEBUG
    cerr << " 2nd axis : " << cosRot << " , " << sinRot << endl;
#endif	// DEBUG

    Transformation2 rotate( CGAL::ROTATION, -sinRot, cosRot );
    for ( unsigned int i = 0; i < subpatch.size(); ++i ) {
	subpatch[ i ]->triangle() = subpatch[ i ]->triangle().transform( rotate );
    }
#endif	// DEBUG
}
예제 #25
0
PetscErrorCode cHamiltonianMatrix::initial_state(){
	gsl_matrix *H0 = gsl_matrix_alloc(L,L);
	gsl_matrix_set_zero(H0);
	for (int j = 0; j < L; ++j) {
	  if (judgeB==1) {
	    gsl_matrix_set(H0,j,j,gsl_vector_get(randV,j));
	  }
	  if (j==0) {
	    gsl_matrix_set(H0,j,j+1,-1.0);
	  } else if(j==L-1){
	    gsl_matrix_set(H0,j,j-1,-1.0);
	  } else {
	    gsl_matrix_set(H0,j,j+1,-1.0);
	    gsl_matrix_set(H0,j,j-1,-1.0);
	  }
	}
//	for (int i = 0; i < L; ++i) {
//		for (int j = 0; j < L; ++j) {
//			cout << gsl_matrix_get(H0,i,j) << '\t' ;
//		}
//		cout << endl;
//	}
	gsl_vector *eval = gsl_vector_alloc (L);
	gsl_matrix *evec = gsl_matrix_alloc (L, L);
	gsl_eigen_symmv_workspace * w_symmv = gsl_eigen_symmv_alloc (L);
	gsl_eigen_symmv (H0, eval, evec, w_symmv);
	gsl_eigen_symmv_free (w_symmv);
	gsl_eigen_symmv_sort (eval, evec, GSL_EIGEN_SORT_VAL_ASC);
//	for (int i = 0; i < L; ++i) {
//		cout << i+1 << "th eigenvalue is " <<  gsl_vector_get (eval, i) << endl;
//		gsl_vector_view evec_i = gsl_matrix_column (evec, i);
//		gsl_vector_fprintf (stdout, &evec_i.vector, "%g");
//	}
	// %initial state---zero temperature.
	ierr = VecCreate(PETSC_COMM_WORLD,&X1);CHKERRQ(ierr);
	ierr = VecSetSizes(X1,nlocal,DIM);CHKERRQ(ierr);
	ierr = VecSetFromOptions(X1);CHKERRQ(ierr);
	ierr = VecDuplicate(X1,&X2);CHKERRQ(ierr);
	gsl_vector * site2 = gsl_vector_alloc(N2);
	gsl_vector_set(site2,0,position);
	if (N2>1) for (int i = 1; i < N2; ++i) 	gsl_vector_set(site2,i,0);
	int p2 = myindex(site2,N2); //%index of impurity particle, also the position on the lattice
	rr = gsl_vector_alloc (DIM);
	// Translation of the matlab code...
//	rr=1-p2:1:L-p2;
//	mm=ones(dim,1);
//	rr=kron(rr',mm);%departure distance!
	for (int irr = 0; irr < dim2; ++irr) {
		for (int imm = 0; imm < dim; ++imm) {
			gsl_vector_set(rr,irr*dim+imm,1-p2+irr);
		}
	}
//	if (rank==0){
//		for (int ivar = 0; ivar < DIM; ++ivar) {
//			cout << gsl_vector_get(rr,ivar) << endl;
//		}
//	}
	double val_det;
	gsl_matrix *slater = gsl_matrix_alloc(N,N);
	gsl_permutation *p = gsl_permutation_alloc(slater->size1);
	int signum;
	for (int jdim = 0; jdim < dim; ++jdim) {
		for (int j1 = 0; j1 < N; ++j1) { // row
			for (int j2 = 0; j2 < N; ++j2) { // col
				gsl_matrix_set(slater,j1,j2,gsl_matrix_get(evec, gsl_matrix_get(basis1,j1,jdim)-1,j2));
			}
		}
		gsl_linalg_LU_decomp(slater , p , &signum); // cout << "rank " << rank << " has signum " << signum << endl;
		val_det = gsl_linalg_LU_det(slater , signum);
//		cout << jdim+1 << "th slater det is " << val_det << endl;
		ierr = VecSetValue(X1,(p2-1)*dim+jdim,val_det, INSERT_VALUES); // X1 is the initial state vector0.
	}
	ierr =  VecAssemblyBegin(X1); CHKERRQ(ierr);
	ierr =  VecAssemblyEnd(X1); CHKERRQ(ierr);
//	ierr = PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_MATLAB);
//	ierr = VecView(X1,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
	gsl_permutation_free (p);
	gsl_vector_free(site2);
	gsl_matrix_free(slater);
	gsl_vector_free (eval);
	gsl_matrix_free (evec);
	gsl_matrix_free (H0);
	return ierr;
}
예제 #26
0
int main(int argc, char **argv){
  
  FILE *data;
  double *matriz;
  int x,y,i,j,a;
  int m3=0,m1=0,m2=0;
  data=opendata(argv[1]);
  countdata(data,&x,&y);
  
  //hacer la matriz provisional
  matriz = loaddata(data,x,y);
  gsl_matrix_view P =gsl_matrix_view_array(matriz,y,x);
  // sacar la media para cada dimension
  gsl_vector *m= gsl_vector_alloc(3);
  for(i=0;i<x;i++){
    for(j=0;j<y;j++){
      if(i==0)
	{
	  m1+= gsl_matrix_get(&P.matrix,j,i);
	}
      if(i==1)
	{
	  m2+= gsl_matrix_get(&P.matrix,j,i);
	}
      if(i==2)
	{
	  m3+= gsl_matrix_get(&P.matrix,j,i);
	}
      m1/= y; m2/= y; m3/=y;
    }
  }
  gsl_vector_set(m,0,m1);
  gsl_vector_set(m,1,m2);
  gsl_vector_set(m,2,m3);
  
  // crear la matriz de covarianza COV
  gsl_matrix *COV= gsl_matrix_alloc(x,x);
  for(i=0;i<x;i++){
    for(a=0;a<x;a++){
      double element=0;
      for(j=0;j<y;j++){
	double ei= gsl_matrix_get(&P.matrix,j,i) - gsl_vector_get(m,i);
	double ea= gsl_matrix_get(&P.matrix,j,a) - gsl_vector_get(m,a);
	double ee=ei*ea;
	element+=ee;
      }
      element/= (y-1);
      gsl_matrix_set(COV,i,a,element);
    }
  }
  
  // calcular los valores propios de la matriz COV
  gsl_vector *eval=gsl_vector_alloc(x);
  gsl_matrix *evec=gsl_matrix_alloc(x,x);
  gsl_eigen_symmv_workspace *w= gsl_eigen_symmv_alloc(x);

  gsl_eigen_symmv(COV,eval,evec,w);
  gsl_eigen_symmv_free(w);
  
  gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_DESC);

  //output
  FILE *fileout;
  fileout=fopen("autovectores_3D_data.dat", "w");

  for(i=0;i<x-1;i++){
    double eval_i= gsl_vector_get(eval,i);
    gsl_vector_view evec_i = gsl_matrix_column (evec,i);
    
    printf("eigenvalue %g\n", eval_i);
    printf("eigenvector = \n");
    gsl_vector_fprintf(stdout, &evec_i.vector, "%g");
    
    float evec_i_0= (float) gsl_vector_get(&evec_i.vector,0); 
    float evec_i_1= (float) gsl_vector_get(&evec_i.vector,1);
    float evec_i_2= (float) gsl_vector_get(&evec_i.vector,2);
    fprintf(fileout,"%f %f %f\n", evec_i_0, evec_i_1, evec_i_2); 
    
  } 
  close(fileout);
  return 0;
}
예제 #27
0
int main(int argc, char **argv)
{
  gsl_matrix *Original;
  gsl_matrix *Mtr_Cov;


  FILE *input;
  int num_lineas;
  int i,j,k;
  double var;

/*---------------------------------------------------------
Verifica cuales archivos fueron usados como input y se asegura de que solo haya cargado uno.
-----------------------------------------------------------*/
  printf("Este programa se ejecutó con %d argumento(s):\n",argc-1);
  for(i=1;i<argc;i++){
    printf("%s\n", argv[i]);
  }
  if(argc!=2){
    printf("se necesita 1 argumento además del nombre del ejecutable!,\n  EXIT!\n");
    exit(1);
    }
    else{
      printf("El archivo a usar es %s\n", argv[1]);

    }
//--------------------------------------------------------
    input=fopen(argv[1],"r");
    if(!input){
      printf("surgió un problema abriendo el archivo\n");
      exit(1);
    }
/*---------------------------------------------------------
toma como archivo base el primer argumento y cuenta sus lineas
-----------------------------------------------------------*/
    num_lineas=0;
    while ((var = fgetc(input)) != EOF){
      if (var =='\n')
	++num_lineas;
    }

    //printf("Número de lineas del archivo:\n -->%d\n",num_lineas); 

/*---------------------------------------------------------
Data allocation
-----------------------------------------------------------*/ 
    rewind(input);
    Original=gsl_matrix_alloc((num_lineas),24);
    // printf("\nOriginal\n");
    gsl_matrix_fscanf(input,Original);
    //gsl_matrix_fprintf (stdout, Original, "%g");
    //CheckPoint
    //printf("matriz escaneada\n");
/*---------------------------------------------------------
Promedio
-----------------------------------------------------------*/ 
    float *prom;
    int y;
    
    prom=malloc((num_lineas) * sizeof(float));
    //printf("...\n");
    for(k=0;k<num_lineas;k++){
      float suma=0.0;
      for(y=0;y<24;y++){
	suma+=gsl_matrix_get(Original,k,y);
      }
      prom[k]=suma/24.0;
    }
    printf("Checkpoint... Promedios\n");

/*---------------------------------------------------------
Efectos en la matriz
-----------------------------------------------------------*/ 
    Mtr_Cov=gsl_matrix_alloc(num_lineas,num_lineas);
    //printf("...\n");
    int l,n,m;
    double sprite=0;
    for(l=0;l<num_lineas;l++){
      for(m=0;m<num_lineas;m++){
	for(n=1;n<24;n++){
	  double flan=gsl_matrix_get(Original,m,n);
	  double agua=prom[m];
	  double frutino=gsl_matrix_get(Original,l,n);
	  double tang=prom[l];
	  double jarra1=(flan-agua);
	  double jarra2=(frutino-tang);
	  //printf("%g  %g\n",jarra1,jarra2);
	  sprite=sprite+(jarra1*jarra2)/24;
	}
	
	gsl_matrix_set(Mtr_Cov,m,l,sprite);
	sprite=0;
      }}
    
/*---------------------------------------------------------
Matriz de covarianza creada;
sacar vectores y valores propios de la matriz.
-----------------------------------------------------------*/
/*
    int pa,po;
    double can;
    for(pa=0;pa<num_lineas;pa++){
      for(po=0;po<num_lineas;po++){
	can=gsl_matrix_get(Mtr_Cov,po,pa);
	printf("%f ",can);
      }
      printf("\n");
    }
*/




    gsl_eigen_symmv_workspace * w = gsl_eigen_symmv_alloc (num_lineas);
    gsl_vector *eval = gsl_vector_alloc (num_lineas);
    gsl_matrix *evec = gsl_matrix_alloc (num_lineas,num_lineas);
  
    gsl_eigen_symmv (Mtr_Cov, eval, evec, w);   
    gsl_eigen_symmv_sort (eval, evec,GSL_EIGEN_SORT_ABS_ASC);
/*---------------------------------------------------------
PON ESA COSA HORROROSA AHI O VERAS!!!
-----------------------------------------------------------*/
    FILE *Out1;
    FILE *Out2;
    
    Out1 = fopen("JorgeHayek_eigenvalues.dat", "w");
    Out2 = fopen("JorgeHayek_eigenvectors.dat", "w");
    
    fprintf(Out1,"EigenValues:\n");
    fprintf(Out2,"EigenVectors:\n");



    for (i = 0; i < num_lineas; i++)
      {
	double eval_i  = gsl_vector_get (eval, i);

	fprintf (Out1,"%g\n", eval_i);
      }

     for (i = 0; i < 11; i++)
      {fprintf(Out2,"--------------------------------------------\nVector %d\n--------------------------------------------\n",i);
	gsl_vector_view evec_i 
	  = gsl_matrix_column (evec, i);

	gsl_vector_fprintf (Out2, 
			    &evec_i.vector, "%g");
	 
      }
     
  





/*---------------------------------------------------------
FIN
-----------------------------------------------------------*/  
    gsl_vector_free (eval);
    gsl_matrix_free (evec);
    gsl_matrix_free(Original);
    fclose(input);
    return 0;
}
예제 #28
0
int gsl_sf_mathieu_a_array(int order_min, int order_max, double qq, gsl_sf_mathieu_workspace *work, double result_array[])
{
  unsigned int even_order = work->even_order, odd_order = work->odd_order,
      extra_values = work->extra_values, ii, jj;
  int status;
  double *tt = work->tt, *dd = work->dd, *ee = work->ee, *e2 = work->e2,
         *zz = work->zz, *aa = work->aa;
  gsl_matrix_view mat, evec;
  gsl_vector_view eval;
  gsl_eigen_symmv_workspace *wmat = work->wmat;
  
  if (order_max > work->size || order_max <= order_min || order_min < 0)
    {
      GSL_ERROR ("invalid range [order_min,order_max]", GSL_EINVAL);
    }
  
  /* Convert the nonsymmetric tridiagonal matrix to a symmetric tridiagonal
     form. */

  tt[0] = 0.0;
  tt[1] = 0.0;
  tt[2] = qq;
  for (ii=1; ii<even_order-1; ii++)
  {
      tt[3*ii] = qq;
      tt[3*ii+1] = 4*ii*ii;
      tt[3*ii+2] = qq;
  }
  tt[3*even_order-3] = qq;
  tt[3*even_order-2] = 4*(even_order - 1)*(even_order - 1);
  tt[3*even_order-1] = 0.0;

  tt[3] *= 2;
  
  status = figi((signed int)even_order, tt, dd, ee, e2);

  if (status) 
    {
      GSL_ERROR("Internal error in tridiagonal Mathieu matrix", GSL_EFAILED);
    }

  /* Fill the period \pi matrix. */
  for (ii=0; ii<even_order*even_order; ii++)
      zz[ii] = 0.0;

  zz[0] = dd[0];
  zz[1] = ee[1];
  for (ii=1; ii<even_order-1; ii++)
  {
      zz[ii*even_order+ii-1] = ee[ii];
      zz[ii*even_order+ii] = dd[ii];
      zz[ii*even_order+ii+1] = ee[ii+1];
  }
  zz[even_order*(even_order-1)+even_order-2] = ee[even_order-1];
  zz[even_order*even_order-1] = dd[even_order-1];
  
  /* Compute (and sort) the eigenvalues of the matrix. */
  mat = gsl_matrix_view_array(zz, even_order, even_order);
  eval = gsl_vector_subvector(work->eval, 0, even_order);
  evec = gsl_matrix_submatrix(work->evec, 0, 0, even_order, even_order);
  gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
  gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);
  
  for (ii=0; ii<even_order-extra_values; ii++)
      aa[2*ii] = gsl_vector_get(&eval.vector, ii);
  
  /* Fill the period 2\pi matrix. */
  for (ii=0; ii<odd_order*odd_order; ii++)
      zz[ii] = 0.0;
  for (ii=0; ii<odd_order; ii++)
      for (jj=0; jj<odd_order; jj++)
      {
          if (ii == jj)
              zz[ii*odd_order+jj] = (2*ii + 1)*(2*ii + 1);
          else if (ii == jj + 1 || ii + 1 == jj)
              zz[ii*odd_order+jj] = qq;
      }
  zz[0] += qq;

  /* Compute (and sort) the eigenvalues of the matrix. */
  mat = gsl_matrix_view_array(zz, odd_order, odd_order);
  eval = gsl_vector_subvector(work->eval, 0, odd_order);
  evec = gsl_matrix_submatrix(work->evec, 0, 0, odd_order, odd_order);
  gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
  gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);

  for (ii=0; ii<odd_order-extra_values; ii++)
      aa[2*ii+1] = gsl_vector_get(&eval.vector, ii);

  for (ii = order_min ; ii <= order_max ; ii++)
    {
      result_array[ii - order_min] = aa[ii];
    }
  
  return GSL_SUCCESS;
}
예제 #29
0
int gsl_sf_mathieu_b_array(int order_min, int order_max, double qq, gsl_sf_mathieu_workspace *work, double result_array[])
{
  unsigned int even_order = work->even_order-1, odd_order = work->odd_order,
      extra_values = work->extra_values, ii, jj;
  double *zz = work->zz, *bb = work->bb;
  gsl_matrix_view mat, evec;
  gsl_vector_view eval;
  gsl_eigen_symmv_workspace *wmat = work->wmat;

  if (order_max > work->size || order_max <= order_min || order_min < 0)
    {
      GSL_ERROR ("invalid range [order_min,order_max]", GSL_EINVAL);
    }

  /* Fill the period \pi matrix. */
  for (ii=0; ii<even_order*even_order; ii++)
      zz[ii] = 0.0;
  for (ii=0; ii<even_order; ii++)
      for (jj=0; jj<even_order; jj++)
      {
          if (ii == jj)
              zz[ii*even_order+jj] = 4*(ii + 1)*(ii + 1);
          else if (ii == jj + 1 || ii + 1 == jj)
              zz[ii*even_order+jj] = qq;
      }

  /* Compute (and sort) the eigenvalues of the matrix. */
  mat = gsl_matrix_view_array(zz, even_order, even_order);
  eval = gsl_vector_subvector(work->eval, 0, even_order);
  evec = gsl_matrix_submatrix(work->evec, 0, 0, even_order, even_order);
  gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
  gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);

  bb[0] = 0.0;
  for (ii=0; ii<even_order-extra_values; ii++)
      bb[2*(ii+1)] = gsl_vector_get(&eval.vector, ii);
  
  /* Fill the period 2\pi matrix. */
  for (ii=0; ii<odd_order*odd_order; ii++)
      zz[ii] = 0.0;
  for (ii=0; ii<odd_order; ii++)
      for (jj=0; jj<odd_order; jj++)
      {
          if (ii == jj)
              zz[ii*odd_order+jj] = (2*ii + 1)*(2*ii + 1);
          else if (ii == jj + 1 || ii + 1 == jj)
              zz[ii*odd_order+jj] = qq;
      }

  zz[0] -= qq;

  /* Compute (and sort) the eigenvalues of the matrix. */
  mat = gsl_matrix_view_array(zz, odd_order, odd_order);
  eval = gsl_vector_subvector(work->eval, 0, odd_order);
  evec = gsl_matrix_submatrix(work->evec, 0, 0, odd_order, odd_order);
  gsl_eigen_symmv(&mat.matrix, &eval.vector, &evec.matrix, wmat);
  gsl_eigen_symmv_sort(&eval.vector, &evec.matrix, GSL_EIGEN_SORT_VAL_ASC);
  
  for (ii=0; ii<odd_order-extra_values; ii++)
      bb[2*ii+1] = gsl_vector_get(&eval.vector, ii);  

  for (ii = order_min ; ii <= order_max ; ii++)
    {
      result_array[ii - order_min] = bb[ii];
    }

  return GSL_SUCCESS;
}
예제 #30
0
/* Function: PCA
 * 
 * Description: Perform PCA calculations and store the results in a CvPoint3D32f 
 *     array
 * 
 * Parameters:
 *     features3DPrime: CvPoint3D32f array to store the resulting points of the
 *         PCA calculation, in PCA space
 *     features3D: the features points to convert to PCA space
 *     numFeatures: number of features
 *     PCAData: the matrices and vectors calculated during PCA, saved for later
 *         reversing the calculations
 */
int PCA(
    _Out_ CvPoint3D32f *features3DPrime, 
    _In_ CvPoint3D32f *features3D, 
    _In_ int numFeatures,
    _Out_ Data *PCAData)
{   
    double xSum = 0.0;
    double ySum = 0.0;
    double zSum = 0.0;
    
    // Find mean of each of the dimensions, and store in vector data->mean
    for (int i = 0; i < numFeatures; i++)
    {
        xSum += features3D[i].x;
        ySum += features3D[i].y;
        zSum += features3D[i].z;        
    }
    
    gsl_vector_set(PCAData->mean, 0, xSum/(double)numFeatures);
    gsl_vector_set(PCAData->mean, 1, ySum/(double)numFeatures);
    gsl_vector_set(PCAData->mean, 2, zSum/(double)numFeatures);
    
    // Get mean-substracted data into matrix data->meanSubstractedPoints.
    for (int i = 0; i < numFeatures; i++)
    {
        double meanSubtractedXValue = features3D[i].x - gsl_vector_get(PCAData->mean, 0);
        double meanSubtractedYValue = features3D[i].y - gsl_vector_get(PCAData->mean, 1);
        double meanSubtractedZValue = features3D[i].z - gsl_vector_get(PCAData->mean, 2);
        
        gsl_matrix_set(PCAData->meanSubstractedPoints, i, 0, meanSubtractedXValue);
        gsl_matrix_set(PCAData->meanSubstractedPoints, i, 1, meanSubtractedYValue);
        gsl_matrix_set(PCAData->meanSubstractedPoints, i, 2, meanSubtractedZValue);

    }        
        
    // Compute Covariance matrix
    gsl_blas_dgemm(CblasTrans, CblasNoTrans, 1.0/(double)numFeatures, PCAData->meanSubstractedPoints, PCAData->meanSubstractedPoints, 0.0, PCAData->covarianceMatrix);
        
    // Get eigenvectors, sort by eigenvalue.
    gsl_eigen_symmv(PCAData->covarianceMatrix, PCAData->eigenvalues, PCAData->eigenvectors, PCAData->workspace);
    gsl_eigen_symmv_sort(PCAData->eigenvalues, PCAData->eigenvectors, GSL_EIGEN_SORT_ABS_DESC);
    
    double maxAbsVals[3] = {0.0, 0.0, 0.0};
    
    // get the maximum absolute value of each column
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            double val = gsl_matrix_get(PCAData->eigenvectors, i, j);
            
            if (fabs(val) > fabs(maxAbsVals[j]))
            {
                maxAbsVals[j] = val;
            }
        }
    }
    
    // If the maximum absolute value of a column is negative, multiply everything
    // in that column by -1. Why? No idea, but that's how the MATLAB PCA function 
    // does it.
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {            
            if (maxAbsVals[j] < 0)
            {
                double val = gsl_matrix_get(PCAData->eigenvectors, i, j);
                gsl_matrix_set(PCAData->eigenvectors, i, j, -1 * val);
            }
        }
    }    
    
    gsl_matrix *scores = gsl_matrix_alloc(numFeatures, 3);
    
    if (scores == NULL)
    {
        return OUT_OF_MEMORY_ERROR;
    }
    
    // multiply the eigenvectors from the PCA by the feature points with the mean
    // subtracted to get the points in PCA space
    gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, PCAData->meanSubstractedPoints, PCAData->eigenvectors, 0.0, scores);
    
    for (int i = 0; i < numFeatures; i++)
    {
        features3DPrime[i].x = gsl_matrix_get(scores, i, 0);
        features3DPrime[i].y = gsl_matrix_get(scores, i, 1);
        features3DPrime[i].z = gsl_matrix_get(scores, i, 2);
    }
    
    // cleanup
    gsl_matrix_free(scores);
    
    return 0;
}