Example #1
0
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;
}
Example #2
0
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));
      }
    }
  }
}
Example #3
0
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);
    }
  }
}