From 8eab85fe4edba01a5354853a75bd983a09fb0eb9 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Fri, 27 May 2011 17:29:02 +0200 Subject: Use reference reflections for scaling --- src/hrs-scaling.c | 136 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 47 deletions(-) (limited to 'src/hrs-scaling.c') diff --git a/src/hrs-scaling.c b/src/hrs-scaling.c index bde7ad98..9b5005d8 100644 --- a/src/hrs-scaling.c +++ b/src/hrs-scaling.c @@ -135,8 +135,62 @@ static double s_vh(struct image *images, int n, } +static gsl_vector *solve_by_eigenvalue_filtration(gsl_vector *v, gsl_matrix *M) +{ + gsl_eigen_symmv_workspace *work; + gsl_vector *e_val; + gsl_matrix *e_vec; + int val, n, frame; + gsl_vector *shifts; + + n = v->size; + if ( v->size != M->size1 ) return NULL; + if ( v->size != M->size2 ) return NULL; + + /* Diagonalise */ + work = gsl_eigen_symmv_alloc(n); + e_val = gsl_vector_alloc(n); + e_vec = gsl_matrix_alloc(n, n); + val = gsl_eigen_symmv(M, e_val, e_vec, work); + if ( val ) { + ERROR("Couldn't diagonalise matrix.\n"); + return NULL; + } + gsl_eigen_symmv_free(work); + val = gsl_eigen_symmv_sort(e_val, e_vec, GSL_EIGEN_SORT_ABS_DESC); + + /* Rotate the "solution vector" */ + gsl_vector *rprime; + rprime = gsl_vector_alloc(n); + val = gsl_blas_dgemv(CblasTrans, 1.0, e_vec, v, 0.0, rprime); + + /* Solve (now easy) */ + gsl_vector *sprime; + sprime = gsl_vector_alloc(n); + for ( frame=0; frameosf * uha * Ih; vc = Ih * rha; @@ -220,6 +284,9 @@ static double iterate_scale(struct image *images, int n, /* Matrix is symmetric */ if ( b > a ) continue; + /* Off-diagonals zero if reference available */ + if ( (reference != NULL) && (a!=b) ) continue; + /* Zero if no common reflections */ if ( cref[a+n*b] != 0 ) continue; @@ -252,43 +319,24 @@ static double iterate_scale(struct image *images, int n, free(uha_arr); free(vha_arr); - /* Fox and Holmes method */ - gsl_eigen_symmv_workspace *work; - gsl_vector *e_val; - gsl_matrix *e_vec; - int val; - - /* Diagonalise */ - work = gsl_eigen_symmv_alloc(n); - e_val = gsl_vector_alloc(n); - e_vec = gsl_matrix_alloc(n, n); - val = gsl_eigen_symmv(M, e_val, e_vec, work); - if ( val ) { - ERROR("Couldn't diagonalise matrix.\n"); - return 0.0; + show_matrix_eqn(M, v, n); + + if ( reference == NULL ) { + shifts = solve_by_eigenvalue_filtration(v, M); + } else { + shifts = gsl_vector_alloc(n); + for ( frame=0; frame