Advertisement
cd62131

Gauss-Jordan elimination

Dec 4th, 2018
591
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.62 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef struct {
  5.     int r, c;
  6.     double *m;
  7. } matrix;
  8. //static matrix *matrix_new(int r, int c) {
  9. //    matrix *m = (matrix *)calloc(sizeof(*m), 1);
  10. //    m->r = r;
  11. //    m->c = c;
  12. //    m->m = (double *)calloc(sizeof(m->m), r * c);
  13. //    return m;
  14. //}
  15. //static void matrix_delete(matrix *m) {
  16. //    free(m->m);
  17. //    free(m);
  18. //}
  19. static double matrix_at(matrix *m, int x, int y) {
  20.     return m->m[m->c * x + y];
  21. }
  22. static void matrix_as(matrix *m, int x, int y, double v) {
  23.     m->m[m->c * x + y] = v;
  24. }
  25. static void pivot(matrix *m, int k) {
  26.     for (int i = k; i < m->r; ++i) {
  27.         double row_i_max = matrix_at(m, i, k);
  28.         for (int j = k + 1; j < m->c; ++j) {
  29.             double e = matrix_at(m, i, j);
  30.             if (fabs(row_i_max) < fabs(e)) {
  31.                 row_i_max = e;
  32.             }
  33.         }
  34.         for (int j = k; j < m->c; ++j) {
  35.             double e = matrix_at(m, i, j);
  36.             matrix_as(m, i, j, e / row_i_max);
  37.         }
  38.     }
  39.     double col_k_max = matrix_at(m, k, k);
  40.     int x = k;
  41.     for (int i = k; i < m->r; ++i) {
  42.         double e = matrix_at(m, i, k);
  43.         if (col_k_max < e) {
  44.             col_k_max = e;
  45.             x = i;
  46.         }
  47.     }
  48.     if (x == k) {
  49.         return;
  50.     }
  51.     for (int i = k; i < m->c; ++i) {
  52.         double e = matrix_at(m, k, i);
  53.         double f = matrix_at(m, x, i);
  54.         matrix_as(m, k, i, f);
  55.         matrix_as(m, x, i, e);
  56.     }
  57. }
  58. static void gauss_jordan_elimination(matrix *m) {
  59.     for (int k = 0; k < m->r; ++k) {
  60.         pivot(m, k);
  61.         double p = matrix_at(m, k, k);
  62.         for (int j = 0; j < m->c; ++j) {
  63.             double e = matrix_at(m, k, j);
  64.             matrix_as(m, k, j, e / p);
  65.         }
  66.         for (int i = 0; i < m->r; ++i) {
  67.             if (i == k) {
  68.                 continue;
  69.             }
  70.             double e = matrix_at(m, i, k);
  71.             for (int j = 0; j < m->c; ++j) {
  72.                 double f = matrix_at(m, i, j);
  73.                 double g = matrix_at(m, k, j);
  74.                 matrix_as(m, i, j, f - e * g);
  75.             }
  76.         }
  77.     }
  78. }
  79. static void matrix_print(matrix *m) {
  80.     for (int i = 0; i < m->r; ++i) {
  81.         for (int j = 0; j < m->c; ++j) {
  82.             printf("%s%lf", ((j == 0) ? "" : " "), matrix_at(m, i, j));
  83.         }
  84.         puts("");
  85.     }
  86. }
  87. int main() {
  88.     double v[] = {
  89.         2., 1., 3., 1., 0., 0.,
  90.         1., 3., 2., 0., 1., 0.,
  91.         3., 2., 1., 0., 0., 1.
  92.     };
  93.     matrix m = { 3, 6, v };
  94.     matrix_print(&m);
  95.     gauss_jordan_elimination(&m);
  96.     matrix_print(&m);
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement