Пример #1
0
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) ;
		}
	}

}
Пример #2
0
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;
}