/* * Calculate the matrix exponent of A and store in eA. * Algorithm: Truncated Talyor series. * * WARNING: Large errors possible and it's slow. */ int gsl_ext_expm_complex(gsl_matrix_complex *A, gsl_matrix_complex *eA) { int i; gsl_complex alpha, beta, z; gsl_matrix_complex *I, *T; I = gsl_matrix_complex_alloc(A->size1, A->size2); T = gsl_matrix_complex_alloc(A->size1, A->size2); GSL_SET_COMPLEX(&alpha, 1.0, 0.0); GSL_SET_COMPLEX(&beta, 0.0, 0.0); gsl_matrix_complex_set_identity(I); gsl_matrix_complex_set_identity(eA); for (i = 50; i > 0; i--) { GSL_SET_COMPLEX(&z, 1.0 / i, 0.0); gsl_matrix_complex_scale(eA, z); gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, alpha, eA, A, beta, T); gsl_matrix_complex_add(T, I); gsl_matrix_complex_memcpy(eA, T); } return 0; }
static void matrix_complex_add_identity(gsl_matrix_complex *m, gsl_complex c) { gsl_matrix_complex *id = gsl_matrix_complex_alloc(m->size1, m->size2); gsl_matrix_complex_set_identity(id); gsl_matrix_complex_scale(id, c); gsl_matrix_complex_add(m, id); gsl_matrix_complex_free(id); }
void qdpack_matrix_add(qdpack_matrix_t *op1, qdpack_matrix_t *op2) { if (op1 == NULL || op2 == NULL) { fprintf(stderr, "%s: ERROR: op1 or op2 is NULL\n", __PRETTY_FUNCTION__); return; } gsl_matrix_complex_add(op1->data, op2->data); }
static VALUE rb_dirac_anticommute(VALUE obj, VALUE mm1, VALUE mm2) { gsl_matrix_complex *m1, *m2; gsl_matrix_complex *mnew1, *mnew2; CHECK_MATRIX_COMPLEX(mm1); CHECK_MATRIX_COMPLEX(mm2); Data_Get_Struct(mm1, gsl_matrix_complex, m1); Data_Get_Struct(mm2, gsl_matrix_complex, m2); mnew1 = gsl_matrix_complex_alloc(m1->size1, m1->size2); mnew2 = gsl_matrix_complex_alloc(m1->size1, m1->size2); gsl_matrix_complex_mul(mnew1, m1, m2); gsl_matrix_complex_mul(mnew2, m2, m1); gsl_matrix_complex_add(mnew1, mnew2); gsl_matrix_complex_free(mnew2); return Data_Wrap_Struct(cgsl_matrix_complex, 0, gsl_matrix_complex_free, mnew1); }
static int cm_add_cm(lua_State *L) { mMatComplex *a = qlua_checkMatComplex(L, 1); mMatComplex *b = qlua_checkMatComplex(L, 2); int al = a->l_size; int ar = a->r_size; mMatComplex *r = qlua_newMatComplex(L, al, ar); if ((al != b->l_size) || (ar != b->r_size)) return luaL_error(L, "matrix sizes mismatch in m + m"); gsl_matrix_complex_memcpy(r->m, a->m); gsl_matrix_complex_add(r->m, b->m); return 1; }