PDA

View Full Version : Problema con incertitore matrici [C++]


xPecax
20-06-2011, 16:54
Ciao a tutti,
devo consegnare a breve un programma che si occupi di invertire una qualsiasi matrice. Vi posto quello che ho scritto, il programma in generale funziona, ma quando ci sono alcuni zeri durante la riduzione della matrice mi da dei problemi. Potete darmi una mano senza sconvolgere il programma???


#include <iostream>



using namespace std;





// ci sono ancora problemi con gli zeri







char p;

int main()

{



do

{

// Allocazione della memoria

double **A;

int n;

cout<< "Creazione matrice n x n \n Inserire il valore di n: ";

cin>>n; cout<<endl;

A=new double*[n];

for(int i=0;i<n;i++)

A[i]=new double[n];







double **I; // Matrice identità

I=new double*[n];

for(int i=0;i<n;i++)

I[i]=new double[n];



for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

if(i==j) I[i][j] = 1;

else I[i][j]=0;







// Ricordarsi di aggiungere un controllo sul determinante: se è = 0, la matrice non si può invertire.





// Riempimento matrice

cout<<endl<<"Riempi la matrice"<<endl;

for(int i=0;i<n;i++)

for(int j=0;j<n;j++)

{

cout<<"Elem " << i+1 << ", " << j+1 << ": ";

cin>>A[i][j];

} cout<<endl;







// Verifica riempimento

cout<< "Questa è la matrice che hai inserito: "<<endl;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<A[i][j] << "\t";

cout<<endl;

} cout<<endl;







//Costruzione della matrice [A|I] come metodo di riduzione

double **B;

B=new double*[n];

for(int i=0;i<n;i++)

B[i]=new double[2*n];



for(int i=0;i<n;i++) // Copio la matrice A in B (che è larga il doppio, quindi 2n)

for(int j=0;j<n;j++)

B[i][j]=A[i][j];



int k=0; // Copio la matrice I nella seconda parte di B

for(int i=0;i<n;i++)

{

for(int j=n;j<2*n;j++,k++)

B[i][j]=I[i][k];

k=0;

}



//-------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------

//Eliminazione sotto la diagonale principale

double *tmp; tmp=new double[2*n];

for(int j=0;j<n-1;j++)

for(int i=j+1;i<n;i++)

if(B[i][j]!=0) {

double mol=B[i][j]/B[j][j];

for(int k=0;k<2*n;k++) tmp[k]=mol*B[j][k];

for(int k=0;k<2*n;k++) B[i][k]-=tmp[k];

}





//Eliminazione sopra la diagonale principale

for(int j=n-1;j>0;j--)

for(int i=j-1;i>=0;i--)

if(B[i][j]!=0) {

double mol=B[i][j]/B[j][j];

for(int k=0;k<2*n;k++) tmp[k]=mol*B[j][k];

for(int k=0;k<2*n;k++) B[i][k]-=tmp[k];

}







//_________________________________________________________________________________________________

//Calcolo determinante

int Det,d;

Det=1;

for(int s=0; s<n-1; s++)

{

if (s==0)

{

d=B[s][s]*B[s+1][s+1];

Det=d;

}

else

{

d=Det*B[s+1][s+1];

Det=d;

}

}

cout<<"Determinante: "<<Det<<endl;



if(Det!=0) //Controllo che il determinante sia !=0

{

//_________________________________________________________________________________________________



//Stampa della matrice ridotta

cout<< "Questa è la matrice ridotta: "<<endl;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<B[i][j] << "\t";

cout<<endl;

} cout<<endl;



//Ultimo step per ottenere la matrice [I|A]

for(int i=0;i<n;i++)

if(B[i][i]!=1) {

double mol=B[i][i];

for(int k=0;k<2*n;k++)

B[i][k]=B[i][k]/mol;

}



//-------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------



//Copia dell'inversa ottenuta

double** Inv;

Inv=new double*[n];

for(int i=0;i<n;i++)

Inv[i]=new double[n];

k=0;

for(int i=0;i<n;i++)

{

for(int j=n;j<2*n;j++,k++)

Inv[i][k]=B[i][j];

k=0;

}





//Scrittura della matrice Inversa

cout<< "Matrice inversa: "<<endl;

for(int i=0;i<n;i++)

{

for(int j=0;j<n;j++)

cout<<Inv[i][j]<< "\t";

cout<<endl;

} cout<<endl;

}

else

cout<<"La matrice non si può invertire!!! "<<endl;









//Deallocazione della memoria

for(int i=0;i<n;i++) {delete I[i];delete A[i];}

delete I;

delete A;

for(int i=0;i<n;i++) delete B[i];

delete B;

delete tmp;







cout<<"Vuoi invertire un'altra matrice? (y/n) "<<endl;

cin>>p;

cout<<endl<<endl;

cout<<"-----------------------------------------------------"<<endl<<endl;

} //chiusura do iniziale

while (p=='y');





}

xPecax
21-06-2011, 10:04
nessuno? D: