n0n4m3
27-02-2010, 17:59
salve a tutti...qualche giorno fa mi sono imbattuto in un problema: inversione di matrici.
a prima vista la cosa sembrava fattibile, avrei usato il metodo di gauss-jordan, ma ora mi trovo bloccato proprio quasi all'inizio. vi espongo il problema: il metodo gauss-jordan (nel caso non lo conosceste) parte semplicemente dal fatto di accostare la matrice che si vuole invertire a quella identità (della stessa grandezza ovviamente) e dunque, tramite operazioni elementari sulle linee di questa "doppia matrice" arrivare ad avere la matrice identità nella prima metà e cio' che si ottiene nella seconda metà sarà poi la matrice inversa che stavamo cercando. come prima cosa dunque bisogna triangolare la matrice iniziale in modo da mettere degli 0 al di sotto della "diagonale" (non è una vera e propria diagonale, potrebbe benissimo essere una scala non regolare) da sinistra a destra e poi risalire da destra a sinistra con lo stesso metodo mettendo degli zeri al di sopra della diagonale. il problema sorge qui: come faccio a trovare il pivot non conoscendo la grandezza della matrice? cioè, ok, il primo si trova in alto a sinistra (se c'è uno 0 allora si invertono due linee e la cosa è a posto) ma poi come faccio a dirgli "ok, hai trovato il primo, bravissimo...ora metti degli zeri sotto e cercami il secondo"??
ecco il pezzo di codice che ho già scritto:
public static int findPivot(int[][] mat)
{
int pivot = 0;
for(int i = 0; i < mat.length; i++)
{
for(int j = 0; j < mat[0].length; j++)
{
if(mat[j][i] != 0)
{
pivot = mat[j][i];
}
}
}
return pivot;
}
come vedete questo comincia col cercare nella prima colonna se c'è il pivot...ma nel caso in cui si trovi nella seconda riga?? e nel caso in cui venga trovato, come faccio poi a dirgli che avendo trovato il primo ora deve cercare il secondo nella seconda colonna?
es:
1 2 3 1 0 0
1 4 7 0 1 0
1 6 8 0 0 1
ok, primo pivot = 1; mettiamo zero al di sotto
1 2 3 1 0 0
0 2 4 -1 1 0
0 4 5 0 0 1
secondo pivot = 2; mettiamo zero sotto (ecco, qui come gli dico non prendermi il primo due che sta sulla prima riga e seconda colonna, bensi quello alla seconda riga e seconda colonna???)
1 2 3 1 0 0
0 2 4 -1 1 0
0 0 -3 0 -2 1
a prima vista la cosa sembrava fattibile, avrei usato il metodo di gauss-jordan, ma ora mi trovo bloccato proprio quasi all'inizio. vi espongo il problema: il metodo gauss-jordan (nel caso non lo conosceste) parte semplicemente dal fatto di accostare la matrice che si vuole invertire a quella identità (della stessa grandezza ovviamente) e dunque, tramite operazioni elementari sulle linee di questa "doppia matrice" arrivare ad avere la matrice identità nella prima metà e cio' che si ottiene nella seconda metà sarà poi la matrice inversa che stavamo cercando. come prima cosa dunque bisogna triangolare la matrice iniziale in modo da mettere degli 0 al di sotto della "diagonale" (non è una vera e propria diagonale, potrebbe benissimo essere una scala non regolare) da sinistra a destra e poi risalire da destra a sinistra con lo stesso metodo mettendo degli zeri al di sopra della diagonale. il problema sorge qui: come faccio a trovare il pivot non conoscendo la grandezza della matrice? cioè, ok, il primo si trova in alto a sinistra (se c'è uno 0 allora si invertono due linee e la cosa è a posto) ma poi come faccio a dirgli "ok, hai trovato il primo, bravissimo...ora metti degli zeri sotto e cercami il secondo"??
ecco il pezzo di codice che ho già scritto:
public static int findPivot(int[][] mat)
{
int pivot = 0;
for(int i = 0; i < mat.length; i++)
{
for(int j = 0; j < mat[0].length; j++)
{
if(mat[j][i] != 0)
{
pivot = mat[j][i];
}
}
}
return pivot;
}
come vedete questo comincia col cercare nella prima colonna se c'è il pivot...ma nel caso in cui si trovi nella seconda riga?? e nel caso in cui venga trovato, come faccio poi a dirgli che avendo trovato il primo ora deve cercare il secondo nella seconda colonna?
es:
1 2 3 1 0 0
1 4 7 0 1 0
1 6 8 0 0 1
ok, primo pivot = 1; mettiamo zero al di sotto
1 2 3 1 0 0
0 2 4 -1 1 0
0 4 5 0 0 1
secondo pivot = 2; mettiamo zero sotto (ecco, qui come gli dico non prendermi il primo due che sta sulla prima riga e seconda colonna, bensi quello alla seconda riga e seconda colonna???)
1 2 3 1 0 0
0 2 4 -1 1 0
0 0 -3 0 -2 1