static VALUE rb_gsl_linalg_complex_householder_mh(VALUE obj, VALUE t, VALUE vv, VALUE aa) { gsl_vector_complex *v = NULL; gsl_complex *tau; gsl_matrix_complex *A = NULL; CHECK_COMPLEX(t); CHECK_VECTOR_COMPLEX(vv); CHECK_MATRIX_COMPLEX(aa); Data_Get_Struct(t, gsl_complex, tau); Data_Get_Struct(vv, gsl_vector_complex, v); Data_Get_Struct(aa, gsl_matrix_complex, A); gsl_linalg_complex_householder_hm(*tau, v, A); return aa; }
void create_random_complex_posdef_matrix(gsl_matrix_complex *m, gsl_rng *r, gsl_vector_complex *work) { const size_t N = m->size1; size_t i, j; double x, y; gsl_complex z; gsl_complex tau; GSL_SET_IMAG(&z, 0.0); /* make a positive diagonal matrix */ gsl_matrix_complex_set_zero(m); for (i = 0; i < N; ++i) { x = gsl_rng_uniform(r); GSL_SET_REAL(&z, x); gsl_matrix_complex_set(m, i, i, z); } /* now generate random householder reflections and form P D P^H */ for (i = 0; i < N; ++i) { /* form complex vector */ for (j = 0; j < N; ++j) { x = 2.0 * gsl_rng_uniform(r) - 1.0; y = 2.0 * gsl_rng_uniform(r) - 1.0; GSL_SET_COMPLEX(&z, x, y); gsl_vector_complex_set(work, j, z); } tau = gsl_linalg_complex_householder_transform(work); gsl_linalg_complex_householder_hm(tau, work, m); gsl_linalg_complex_householder_mh(gsl_complex_conjugate(tau), work, m); } } /* create_random_complex_posdef_matrix() */
/** * C++ version of gsl_linalg_complex_householder_hm(). * @param tau A scalar * @param v A vector * @param A A matrix * @return Error code on failure */ inline int complex_householder_hm( complex& tau, vector_complex const& v, matrix_complex& A ){ return gsl_linalg_complex_householder_hm( tau.get(), v.get(), A.get() ); }
int gsl_linalg_hermtd_unpack (const gsl_matrix_complex * A, const gsl_vector_complex * tau, gsl_matrix_complex * U, gsl_vector * diag, gsl_vector * sdiag) { if (A->size1 != A->size2) { GSL_ERROR ("matrix A must be sqaure", GSL_ENOTSQR); } else if (tau->size + 1 != A->size1) { GSL_ERROR ("size of tau must be (matrix size - 1)", GSL_EBADLEN); } else if (U->size1 != A->size1 || U->size2 != A->size1) { GSL_ERROR ("size of U must match size of A", GSL_EBADLEN); } else if (diag->size != A->size1) { GSL_ERROR ("size of diagonal must match size of A", GSL_EBADLEN); } else if (sdiag->size + 1 != A->size1) { GSL_ERROR ("size of subdiagonal must be (matrix size - 1)", GSL_EBADLEN); } else { const size_t N = A->size1; size_t i; /* Initialize U to the identity */ gsl_matrix_complex_set_identity (U); for (i = N - 1; i-- > 0;) { gsl_complex ti = gsl_vector_complex_get (tau, i); gsl_vector_complex_const_view c = gsl_matrix_complex_const_column (A, i); gsl_vector_complex_const_view h = gsl_vector_complex_const_subvector (&c.vector, i + 1, N - (i+1)); gsl_matrix_complex_view m = gsl_matrix_complex_submatrix (U, i + 1, i + 1, N-(i+1), N-(i+1)); gsl_linalg_complex_householder_hm (ti, &h.vector, &m.matrix); } /* Copy diagonal into diag */ for (i = 0; i < N; i++) { gsl_complex Aii = gsl_matrix_complex_get (A, i, i); gsl_vector_set (diag, i, GSL_REAL(Aii)); } /* Copy subdiagonal into sdiag */ for (i = 0; i < N - 1; i++) { gsl_complex Aji = gsl_matrix_complex_get (A, i+1, i); gsl_vector_set (sdiag, i, GSL_REAL(Aji)); } return GSL_SUCCESS; } }