void matrix_to_entity(MATRIX *m) { int depth, cur, maxdepth = MIN(m->cols, m->rows) ; for(depth = 0; depth < maxdepth; depth++) { for (cur = depth+1; cur < maxdepth; cur++) { FRAC *piv = matrix_get_val(m, depth, depth) ; FRAC *tz = matrix_get_val(m, cur, depth) ; FRAC fac ; if(tz->num != 0) { frac_div(&fac, piv, tz) ; frac_negate(&fac, &fac) ; matrix_multiply_row(m, cur, &fac) ; matrix_add_row(m, cur, depth) ; } } } for(depth = maxdepth - 1; depth >= 0; depth--) { for (cur = depth-1; cur >= 0; cur--) { FRAC *piv = matrix_get_val(m, depth, depth) ; FRAC *tz = matrix_get_val(m, cur, depth) ; FRAC fac ; if(tz->num != 0) { frac_div(&fac, piv, tz) ; frac_negate(&fac, &fac) ; matrix_multiply_row(m, cur, &fac) ; matrix_add_row(m, cur, depth) ; } } } for(depth = 0; depth < maxdepth; depth++) { FRAC t, *e = matrix_get_val(m, depth, depth) ; if (e->num != 0) { frac_inverse(&t,e) ; matrix_multiply_row(m, depth, &t) ; } } }
static void * matrix_multiply_thread(void *data_) { size_t pos, end; struct matrix_multiply_data *data; struct crossing_list tmp_list; data = data_; crossing_list_init(&tmp_list); pthread_mutex_lock(&data->lock); while(data->count < data->crossings->count) { /* Take a THREAD_CHUNK_SIZE bunch of crossings (i.e. matrix rows) */ pos = data->count; end = pos + THREAD_CHUNK_SIZE; if (end > data->crossings->count) end = data->crossings->count; data->count = end; pthread_mutex_unlock(&data->lock); for (; pos < end; ++pos) { /* Compute the corresponding multiplications */ matrix_multiply_row(data->out_vec[pos], data->in_vec, data->crossings->crossings[pos], data->crossings, &tmp_list, data->binary_pieces); } pthread_mutex_lock(&data->lock); } pthread_mutex_unlock(&data->lock); crossing_list_destroy(&tmp_list); return NULL; }