[ create a new paste ] login | about

Link: http://codepad.org/PPuJun3E    [ raw code | output | fork ]

C, pasted on Oct 23:
#include <stdio.h>
#include <math.h>

#define N 3
#define EPSILON 0.00001

void input_matrix(double m[][N]) {
  int i, j;
  for (i = 0; i < N; i++)
    for (j = 0; j < N; j++) {
      printf("%d-%d: ", i, j);
      scanf("%lf", &m[i][j]);
    }
}
void dump_matrix(double m[][N]) {
  int i, j;
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++)
      printf("%.2f ", m[i][j]);
    putchar('\n');
  }
  putchar('\n');
}

int calc_rank(double m[][N]) {
  int k, i, j;
  double max, tmp;
  int max_idx;
  for (k = 0; k < N; k++) {
    /* pivot */
    max_idx = k;
    max = fabs(m[k][k]);
    for (i = k; i < N; i++)
      if (fabs(m[i][k]) > max) {
        max_idx = i;
        max = m[i][k];
      }
    if (fabs(max) < EPSILON)
      return k;
    for (i = k; i < N; i++) {
      tmp = m[k][i];
      m[k][i] = m[max_idx][i];
      m[max_idx][i] = tmp;
    }
    /* forward */
    for (i = k + 1; i < N; i++) {
      for (j = k + 1; j < N; j++)
        if (fabs(m[i][k]) > EPSILON)
          m[i][j] = m[k][k] / m[i][k] * m[i][j] - m[k][j];
      m[i][k] = 0.0;
/*      dump_matrix(m); */
    }
  }
  return k;
}

int main() {
  double m[N][N];
  input_matrix(m);
  printf("rank: %d\n", calc_rank(m));
  return 0;
}
/* end */


Output:
1
0-0: 0-1: 0-2: 1-0: 1-1: 1-2: 2-0: 2-1: 2-2: rank: 3


Create a new paste based on this one


Comments: