typedef unsigned int size_t; struct gsl_block_struct { size_t size; double *data; }; typedef struct gsl_block_struct gsl_block; typedef struct { size_t size1; size_t size2; size_t tda; double * data; gsl_block * block; int owner; } gsl_matrix; gsl_matrix *gsl_matrix_alloc (const size_t n1, const size_t n2); void gsl_matrix_free (gsl_matrix * m); inline double gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j) { return m->data[i * m->tda + j] ; } inline void gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x) { m->data[i * m->tda + j] = x ; } int gsl_matrix_transpose_memcpy (gsl_matrix * dest, const gsl_matrix * src); extern double cos ( double ); extern double sin ( double ); extern double fabs ( double ); typedef struct { size_t size; size_t stride; double *data; gsl_block *block; int owner; } gsl_vector; gsl_vector *gsl_vector_alloc (const size_t n); void gsl_vector_free (gsl_vector * v); inline void gsl_vector_set (gsl_vector * v, const size_t i, double x) { v->data[i * v->stride] = x; } void gsl_test (int status, const char *test_description, ...); int gsl_blas_dger (double alpha, const gsl_vector * X, const gsl_vector * Y, gsl_matrix * A); int gsl_linalg_LQ_decomp (gsl_matrix * A, gsl_vector * tau); int gsl_linalg_LQ_unpack (const gsl_matrix * LQ, const gsl_vector * tau, gsl_matrix * Q, gsl_matrix * L); enum CBLAS_TRANSPOSE {CblasNoTrans=111, CblasTrans=112, CblasConjTrans=113}; typedef enum CBLAS_TRANSPOSE CBLAS_TRANSPOSE_t; int gsl_blas_dgemv (CBLAS_TRANSPOSE_t TransA, double alpha, const gsl_matrix * A, const gsl_vector * X, double beta, gsl_vector * Y); int gsl_linalg_LQ_update (gsl_matrix * Q, gsl_matrix * R, const gsl_vector * v, gsl_vector * w); int gsl_blas_dgemm (CBLAS_TRANSPOSE_t TransA, CBLAS_TRANSPOSE_t TransB, double alpha, const gsl_matrix * A, const gsl_matrix * B, double beta, gsl_matrix * C); int check (double x, double actual, double eps) { if (x == actual) { return 0; } else if (actual == 0) { return fabs(x) > eps; } else { return (fabs(x - actual)/fabs(actual)) > eps; } } gsl_matrix * create_general_matrix(unsigned long size1, unsigned long size2) { unsigned long i, j; gsl_matrix * m = gsl_matrix_alloc(size1, size2); for(i=0; isize1, N = m->size2; gsl_matrix * lq1 = gsl_matrix_alloc(N,M); gsl_matrix * lq2 = gsl_matrix_alloc(N,M); gsl_matrix * q1 = gsl_matrix_alloc(M,M); gsl_matrix * l1 = gsl_matrix_alloc(N,M); gsl_matrix * q2 = gsl_matrix_alloc(M,M); gsl_matrix * l2 = gsl_matrix_alloc(N,M); gsl_vector * d2 = gsl_vector_alloc( ( ( M ) < ( N ) ? ( M ) : ( N ) )); gsl_vector * u = gsl_vector_alloc(M); gsl_vector * v = gsl_vector_alloc(N); gsl_vector * w = gsl_vector_alloc(M); gsl_matrix_transpose_memcpy(lq1,m); gsl_matrix_transpose_memcpy(lq2,m); for(i=0; i