matrix_t * symm_pivot_ge_matrix (matrix_t * a, int *row_per) { matrix_t *c = copy_matrix (a); if (c != NULL) { int i, j, k; int cn = c->cn; int rn = c->rn; double *e = c->e; for (i = 0; i < rn; i++) row_per[i] = i; for (k = 0; k < rn - 1; k++) { /* eliminujemy (zerujemy) kolumnę nr k */ int piv = k; /* wybór eleemntu dominującego - maks. z k-tej kol., poniżej diag */ for (i = k + 1; i < rn; i++) if (fabs (*(e + i * cn + k)) > fabs (*(e + piv * cn + k))) piv = i; if (piv != k) { /* jeśli diag. nie jest pivtem - wymień wiersze */ int tmp; xchg_rows (c, piv, k); xchg_cols (c, piv, k); tmp = row_per[k]; row_per[k] = row_per[piv]; row_per[piv] = tmp; } for (i = k + 1; i < rn; i++) { /* pętla po kolejnych wierszach poniżej diagonalii k,k */ double d = *(e + i * cn + k) / *(e + k * cn + k); for (j = k; j < cn; j++) *(e + i * cn + j) -= d * *(e + k * cn + j); } } } return c; }
void pivot_ge_in_situ_matrix (matrix_t * c) { size_t i, j, k; double x, y,z,f,a; size_t cn = c->mat->size2; size_t rn = c->mat->size1; double d; for (k = 0; k < rn-1; k++) { /* eliminujemy (zerujemy) kolumnę nr k */ size_t piv = k; for (i = k + 1; i < rn; i++){ x=gsl_matrix_get(c->mat,i,k); y=gsl_matrix_get(c->mat,piv,k); if (fabs(x) > fabs(y)) piv = i;} if (piv != k) { /* jeśli diag. nie jest pivtem - wymień wiersze */ xchg_rows (c, piv, k); } for (i = k + 1; i < rn; i++) { x=gsl_matrix_get(c->mat,i,k); f=gsl_matrix_get(c->mat,k,k); d = x/ f; for (j = k; j < cn; j++){ z=gsl_matrix_get(c->mat,i,j); a=gsl_matrix_get(c->mat,k,j); gsl_matrix_set(c->mat,i,j,z-(d*a)); } } } }
void pivot_ge_in_situ_matrix (matrix_t * c) { int i, j, k; int cn = c->cn; int rn = c->rn; double *e = c->e; for (k = 0; k < rn - 1; k++) { /* eliminujemy (zerujemy) kolumnę nr k */ int piv = k; /* wybór elementu dominującego - maks. z k-tej kol., poniżej diag */ for (i = k + 1; i < rn; i++) if (fabs (*(e + i * cn + k)) > fabs (*(e + piv * cn + k))) piv = i; if (piv != k) { /* jeśli diag. nie jest pivtem - wymień wiersze */ xchg_rows (c, piv, k); } for (i = k + 1; i < rn; i++) { /* pętla po kolejnych wierszach poniżej diagonalii k,k */ double d = *(e + i * cn + k) / *(e + k * cn + k); for (j = k; j < cn; j++) *(e + i * cn + j) -= d * *(e + k * cn + j); } } }