Una ulteriore variante del pivot consiste nello scambiare opportunamente anche le colonne della matrice A, calcolando così la fattorizzazione di PAQ, dove P scambia le righe e Q scambia le colonne (sono entrambe matrici di permutazione). Lo scambio di colonne serve solo a rendere l'algoritmo più stabile (teoricamente il solo scambio di righe basta per l'esistenza della fattorizzazione LU).
Al passo k, anziché prendere come pivot akk si può
prendere un qualunque aij (con ). Di solito si
sceglie l'elemento di massimo modulo in tutta la sottomatrice
di indici
.
Fare questa scelta però richiede O(n2)operazioni solo per determinare il pivot:
/* Passo k dell'eliminazione di Gauss con pivot totale */ /* Ricerca del pivot su righe e colonne */ pivot = a[k][k]; irig = k; icol = k; for (i=k; i<n; i++) for (j=k; j<n; j++) if ( fabs(a[i][j])>fabs(pivot) ) { pivot = a[i][j]; irig = i; icol = j; } ...Adesso bisogna scambiare la riga k con la irig, e la colonna k con la icol. Lo scambio di righe si fa come prima. Quello di colonne si può fare
Se si risolve un sistema lineare, bisogna tener conto che lo scambio di
colonne non trasforma il sistema in un altro equivalente: si deve
infatti ``riaggiustare'' il vettore soluzione. In pratica si è trasformato
il sistema
in
.
Quindi alla fine dell'intero
algoritmo (dopo la sostituzione all'indietro) il vettore soluzione trovato
sarà
,
e bisogna applicargli Q a sinistra (= scambio di righe)
per ottenere il vero
.
Utilizzando il vettore indice di colonna, ciò
significa che
/* Sia x[] il vettore ottenuto */ for (i=0; i<n; i++) verox[i] = x[ c[i] ];
Si noti che il metodo di Gauss con il pivot totale viene molto rallentato sia dalla ricerca del pivot, sia dall'accesso ad ogni singolo elemento (che richiede l'accesso al vettore indice). Questi rallentamenti consentono un miglioramento della stabilità solo marginale, per cui questo metodo, nella pratica, non è molto utilizzato.