Metodo di Gauss-Jordan: linee per l'implementazione

In primo luogo, utilizzando l'ADT delle matrici visto a lezione, sono dichiarati i tipi:
typedef double T;

typedef struct {
    int row, col;
    T** mtr;
} matrix_frm;

typedef matrix_frm* Matrix;
Si rammenta che l'implementazione dinamica di questo ADT rende possibile creare matrici di dimensioni assegnate al momento dell'allocazione (quindi in fase di esecuzione, non in quella di compilazione).

Nel file che contiene il main implementiamo le funzioni i cui proptotipi sono:

void RowSwap(Matrix m, int r1, int r2);
// pre:  r1 ed r2 sono righe di m
// post: la matrice m ha le righe r1 ed r2 scambiate tra loro

void MultRowScalar(Matrix m, int r, T sc);
// pre:  r e' una riga di m
// post: la matrice m ha la riga r moltiplicata per lo scalare sc:
//       m[r] := m[r] * sc

void SumRowMultScalar(Matrix m, int r1, int r2, T sc);
// pre:  r1 ed r2 sono righe di m
// post: la matrice m ha la riga r1 sommata alla
//       riga r2 moltiplicata per lo scalare sc:
//       m[r1] := m[r1] + (m[r2] * sc)
Abbiamo quindi tutto quanto occore per realizzare l'algoritmo implementato dalla funzione GaussJordan:
void GaussJordan(Matrix m);
// pre:  m e' la matrice aumentata di un sistema di equazioni
//       lineari
// post: m e' la matrice aumentata con la parte dei coefficienti
//       ridotta all'identita', se quadrata.
la cui pseudocodifica e':
function GaussJordan (m: matrix): boolean;
// pre: m e' la matrice aumentata dei coefficienti e dei
//      termini noti di un sistema di equazioni lineari
// post: ritorna true se la matrice dei cofficienti puo'
//      essere diagonalizzata; false altrimenti
var d, k, i: integer;
begin
   d := il minimo tra il numero delle righe ed il
        numero delle colonne - 1 di m;
   // se m e' ottenuta aumentando una matrice quadrata n*n, d = n

   for k := 1 to d do begin
       if esiste i in [k..righe] t.c. m[i,k] != 0
       then begin
                scambia(m[k],m[i]);
                m[k] := m[k] * 1/m[k,k]
       // post: la riga k avra' 1 sulla diagonale
       end else return false
       // la matrice dei coefficienti (se quadrata) e' singolare;
       // in ogni caso il sistema non ha un'unica soluzione

       for i := 1 to righe do
          if i != k and m[i,k] != 0 then
               m[i] := m[i] + m[k]*(-m[i,k]);
       // post: la colonna k ha 0 in ogni riga salvo k
   end return true
end;
Importante. Nella pseudocodifica dell'algoritmo si è indicato con m[i] la i-esima riga, e con m[i,j] l'entrata di m sulla riga i e colonna j. Si è inoltre assunto che gli indici siano maggiori o eguali a 1: la qual cosa non è necessariamente vera della rappresentazione interna. Inoltre le notazioni con parentesi quadre non devono interpretarsi come operatori di indirezione del linguaggio C: al contrario tutta l'implementazione deve basarsi, per l'accesso alle matrici, esclusivamente sulle funzioni dell'ADT Matrix.