|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
[C] matrice inversa 4x4 con algoritmo di Gauss
ragazzi sto veramente uscendo pazzo......
voglio implementare l'algoritmo di gauss per calcolare la matrice inversa di una 4x4, ma non so più che pesci prendere visto che i risultati non sono mai corretti...il listato al post 3(Ogni consiglio è ben accetto)
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 08-12-2008 alle 11:21. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
edit
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 08-12-2008 alle 11:21. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
nuova release
Codice:
#include <math.h>
#include <stdio.h>
void inversa(float (*a)[4]) {
int i;
int j;
int z;
float b[4][4] = {{ 1, 0, 0, 0},{ 0, 1, 0, 0},{ 0, 0, 1, 0},{ 0, 0, 0, 1}};
float c;
float d;
for (z=0;z<3;z++) {
for (i=z;i<3;i++) {
if (a[i+1][z]=0){
continue;}
else
{ c = -(a[i+1][z] / a[i][z]);
for (j=z;j<3;j++) {
a[i + 1][j] = (c * (a[i][j])) + a[i + 1][j];
b[i + 1][j] = (c * (b[i][j])) + b[i + 1][j];
}
}
}
}
for (z=0;z<3;z++) {
for (i=(3-z);i>0;i--) {
if(a[i-1][3-z]=0){
continue; }
else
{
d = -(a[i-1][(3-z)]) / a[i][3-z];
for (j=(3-z);j>0;j--)
{
a[i-1][j]=(d*(a[i][j]))+a[i-1][j];
b[i-1][j]=(d*(b[i][j]))+b[i-1][j];
}
}
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
b[i][j] = b[i][j] / a[i][i];
a[i][j] = a[i][j] / a[i][i];
}
}
for (i = 0; i <4; i++) {
printf("\n");
for (j = 0; j <4; j++) {
printf("%f" , a[i][j]);
}
}
for (i = 0; i < 4; i++) {
printf("\n");
for (j = 0; j < 4; j++) {
printf("%f", b[i][j]);
}
}
}
int main(void) {
float mat[4][4];
printf("Scrivi gli elementi della matrice:\n");
int i;
int j;
for (i = 0;i < 4; i++) {
for (j = 0; j < 4 ;j ++) {
scanf("%f", &mat[i][j]);
}
}
inversa(mat);
return (0);
}
Codice:
1.000000nannannan nannannannan nannannannan nannannan1.000000 1.000000nannannan nannannannan nannannannan
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 09-12-2008 alle 00:03. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: May 2004
Messaggi: 84
|
Codice:
... if (a[i+1][z] = 0) ... if (a[i-1][3-z] = 0) ... |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
Codice:
for (z=0;z<3;z++) {
for (i=z;i<3;i++) {
c = -(a[i+1][z] / a[z][z]);
for (j=z;j<4;j++) {
a[i + 1][j] = c*a[i][j] + a[i + 1][j];
b[i + 1][j] =c*b[i][j]+ b[i + 1][j];
}
}
}
for (z=0;z<3;z++) {
for (i=(3-z);i>0;i--){
d = -(a[i-1][(3-z)]) / a[3-z][3-z];
for (j=(3-z);j> -1;j--){
a[i-1][j]=d*a[i][j]+a[i-1][j];
b[i-1][j]=d*b[i][j]+b[i-1][j];
}
}
}
questa è l'uscita Codice:
1.000000-1.0000002.000000-1.000000 0.0000001.000000-1.0000001.000000 0.0000000.0000001.000000-1.000000 0.0000000.0000000.0000001.000000 Codice:
1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 09-12-2008 alle 00:05. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
mi sono accorto di un piccolo errore nell'implementazione dell'algoritmo e ho nuovamente modificato il programma
Codice:
for (z=0;z<3;z++) {
for (i=z;i<3;i++) {
c = -(a[i+1][z] / a[z][z]);
for (j=z;j<4;j++) {
a[i][j]= c * a[i][j];
a[i + 1][j] = a[i][j] + a[i + 1][j];
b[i][j]= c * b[i][j];
b[i + 1][j] =b[i][j]+ b[i + 1][j];
}}}
for (z=0;z<3;z++) {
for (i=(3-z);i>0;i--){
d = -(a[i-1][(3-z)]) / a[3-z][3-z];
for (j=(3-z);j> -1;j--)
{ a[i][j]= d*a[i][j];
a[i-1][j]=a[i][j]+a[i-1][j];
b[i][j]= d*b[i][j];
b[i-1][j]=b[i][j]+b[i-1][j];
}}}
Codice:
nannannannan nannannannan nannannannan nannannannan nannannannan nannannannan nannannannan nannannannan come mai?eppure dovrebbe essere giusto
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 09-12-2008 alle 00:02. |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Perchè non usi il tag [code] o [php] ? Renderebbe la lettura del codice molto più leggibile.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
ok metto subito a posto. grazie per la segnalazione
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Se ottieni NaN e' perche' vai a fare le divisioni per zero.
In effetti hai un paio di divisioni che andrebbero controllate. Cosa devi fare, secondo l'algoritmo, nel caso che il divisore sia zero?
__________________
In God we trust; all others bring data |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Questo vuol dire che puoi aggiungere una assert al tuo codice per essere veramente sicuro di questo
__________________
In God we trust; all others bring data |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
che cos'è una assert?
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
si scrive assert(condizione che vuoi verificare) e se la condizione non e' verificata, si arrabbia e fa terminare il programma.
Hai provato a far girare il debugger?
__________________
In God we trust; all others bring data |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Spero che questo esercizio me lo chiarisca
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
Codice:
}
for (z=0;z<3;z++) {
for (i=z;i<3;i++) {
if (z=0){ c = -(a[i+1][z] / a[z][z]);}
else {c=-(a[i+1][z] / p[z][z]);}
for (j=z;j<4;j++) {
p[i][j]=c*a[i][j];
a[i + 1][j] =p[i][j] + a[i + 1][j];
q[i][j]=c*b[i][j];
b[i + 1][j] =q[i][j] + b[i + 1][j];
}
}
}
for (z=0;z<3;z++) {
for (i=(3-z);i>0;i--){
if(z=0) { d = -(a[i-1][(3-z)]) / a[3-z][3-z];}
else{d = -(a[i-1][(3-z)]) / p[3-z][3-z];}
for (j=(3-z);j> -1;j--){
p[i][j]=d*a[i][j];
a[i-1][j]=p[i][j]+a[i-1][j];
q[i][j]=d*b[i][j];
b[i-1][j]=q[i][j]+b[i-1][j];
}
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
b[i][j] = b[i][j] / a[i][i];
a[i][j] = a[i][j] / a[i][i];
}
}
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 09-12-2008 alle 15:33. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quell'if non va bene (z=0 e' un assegnamento).
Ho fatto un giro di debugger fermandomi immediatamente al primo ciclo (il risultato e' gia' incorretto li', per cui non ho proseguito). Dopo la prima iterazione del ciclo Codice:
for (i=z;i<3;i++)
{
Wikipedia suggerisce una cosa cosi': Codice:
i := 1
j := 1
while (i ≤ m and j ≤ n) do
Find pivot in column j, starting in row i:
maxi := i
for k := i+1 to m do
if abs(A[k,j]) > abs(A[maxi,j]) then
maxi := k
end if
end for
if A[maxi,j] ≠ 0 then
swap rows i and maxi, but do not change the value of i
Now A[i,j] will contain the old value of A[maxi,j].
divide each entry in row i by A[i,j]
Now A[i,j] will have the value 1.
for u := i+1 to m do
subtract A[u,j] * row i from row u
Now A[u,j] will be 0, since A[u,j] - A[i,j] * A[u,j] = A[u,j] - 1 * A[u,j] = 0.
end for
i := i + 1
end if
j := j + 1
end while
__________________
In God we trust; all others bring data Ultima modifica di sottovento : 09-12-2008 alle 15:53. |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
la matrice di prova che io uso è 1111 0111 0011 0001
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Ho completamente scordato questo algoritmo, per cui perdona la mia domanda: sei sicuro che devi modificare la matrice "on-the-fly" (i.e. durante l'esecuzione del ciclo) e non alla fine? Normalmente questo tipo di algoritmi va a preparare una seconda matrice on i risultati. Questa matrice poi diventa quella di partenza per il ciclo successivo... Inoltre, per quel poco che ho letto su wikipedia, sembra che sia normale il fatto che il tuo elemento sia azzerato, proprio per come e' fatto l'algoritmo. Forse e' semplicemente la scelta del pivot che va cambiata. Spero ti sia di aiuto....
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jan 2003
Città: Frosinone
Messaggi: 2607
|
Quote:
L'algoritmo di Gauss trasforma una qualsiasi matrice in una matrice a scalini tramite mosse di Gauss. Funziona nel modo seguente: 1. Se la prima riga ha il primo elemento nullo, scambiala con una riga che ha il primo elemento non nullo. Se tutte le righe hanno il primo elemento nullo, vai al punto 3. 2. Per ogni riga Ai con primo elemento non nullo, eccetto la prima (i > 1), moltiplica la prima riga per un coefficiente scelto in maniera tale che la somma tra la prima riga e Ai abbia il primo elemento nullo (quindi coefficiente − Ai1 / A11). Sostituisci Ai con la somma appena ricavata. 3. Adesso sulla prima colonna tutte le cifre, eccetto forse la prima, sono nulle. A questo punto ritorna al punto 1 considerando la sottomatrice che ottieni cancellando la prima riga e la prima colonna. Le successive mosse di Gauss (scambi, moltiplicazioni e somme) andranno comunque fatte su tutta la matrice. quindi come vedi l'algoritmo modifica il coefficiente c per ogni incremento di i e naturalmente anche di z. adesso con l'ultimo codice scritto non ho più problemi di nan, ma solodi 3 valori su 16 sballatidovuti al fatto che la riga z-esima (la prima di ogni sottomatrice dell'algoritmo) non viene mai moltiplicata per c ma rimane statica Scusa ma perchè il ciclo if di prima non andrebbe bene?come dovrebbe essere? ti volevo ringraziare in ogni caso, perchè a occhio dalle tue parti dovrebbe essere parecchio tardi
__________________
Phenom II 920 Asus m4a79 deluxe, Sapphire hd4850 1 GB,4 GB G.SKILL PI 1200 Mhz ,HD Maxtor 250gb Sata II
Ultima modifica di Thunderx : 09-12-2008 alle 17:12. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:35.




















