int linalg_prod (lua_State *L) { const gsl_matrix *a = matrix_check (L, 1); const gsl_matrix *b = matrix_check (L, 2); gsl_matrix *r = matrix_push (L, a->size2, b->size2); if (a->size1 != b->size1) luaL_error (L, "incompatible matrix dimensions in multiplication"); gsl_blas_dgemm (CblasTrans, CblasNoTrans, 1.0, a, b, 1.0, r); return 1; }
int linalg_svd (lua_State *L) { const gsl_matrix *a = matrix_check (L, 1); int sm = a->size1, sn = a->size2; gsl_matrix *u, *v, *s; gsl_vector *s_vec, *work; int k; u = matrix_push_raw (L, sm, sn); s = matrix_push_raw (L, sn, sn); v = matrix_push_raw (L, sn, sn); s_vec = gsl_vector_alloc (sn); work = gsl_vector_alloc (sn); gsl_matrix_memcpy (u, a); gsl_linalg_SV_decomp (u, v, s_vec, work); for (k = 0; k < sn; k++) { double z = gsl_vector_get (s_vec, k); gsl_matrix_set (s, k, k, z); } gsl_vector_free (s_vec); gsl_vector_free (work); return 3; }
void solver_get_x0 (lua_State *L, gsl_vector_view *x0, size_t p) { gsl_matrix *m; lua_getfield (L, 1, "x0"); m = matrix_check (L, -1); if (m->size2 != 1 || m->size1 != p) luaL_error (L, "x0 should be a vector of length %d", p); *x0 = gsl_matrix_column (m, 0); lua_pop (L, 1); }
void check_matrix_mul_dotp(testresult_t *result, void (*start)(), void (*stop)()) { int N = SIZE; int M = SIZE; signed short matA[N*M]; signed short matB[N*M]; signed int matC[N*M]; matrix_init(matA, matB, matC); // start benchmark start(); matMul16_t_dot(matA, matB, matC, N, M); stop(); result->errors = matrix_check(matC); }