#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "Sistema.h"
void inizializzaMatrice(Tmatrice *nuova, int dimensione)
{
nuova->lato=abs(dimensione);
int elementi, i;
elementi=nuova->lato * nuova->lato;
nuova->elementi=(double *) malloc(elementi * sizeof(double));
for (i = 0; i < elementi; i++)
nuova->elementi[i]=0.0;
}
void deallocaMatrice(Tmatrice *vecchia)
{
if (vecchia->elementi != NULL)
{
int i, j;
i=0;
while (i < vecchia->lato)
{
j=0;
while (j < vecchia->lato)
{
setElemento(*vecchia, i, j, 0.0);
j++;
}
i++;
}
free(vecchia->elementi);
vecchia->elementi=NULL;
vecchia->lato=0;
}
}
void setElemento(Tmatrice matrix, int riga, int colonna, double valore)
{
int posizione;
posizione=riga * matrix.lato + colonna;
if (posizione<0 || posizione >= (matrix.lato * matrix.lato))
return;
matrix.elementi[posizione]=valore;
}
double getElemento(Tmatrice matrix, int riga, int colonna)
{
int posizione;
posizione=riga * matrix.lato + colonna;
if (posizione<0 || posizione >= (matrix.lato * matrix.lato))
return 0.0;
return matrix.elementi[posizione];
}
void stampaMatrice(Tmatrice matrix)
{
int i, j;
double valore;
printf("\nStampa della matrice:\n");
for (i=0; i < matrix.lato; i++)
{
for (j=0; j < matrix.lato; j++)
{
valore=getElemento(matrix, i, j);
}
}
}
double determinante(Tmatrice matrix)
{
if (matrix.lato == 1)
return getElemento(matrix, 0, 0);
if (matrix.lato == 2)
return getElemento(matrix, 1, 1) * getElemento(matrix, 0, 0) - getElemento(matrix, 1, 0) * getElemento(matrix, 0, 1);
Tmatrice subMatrix;
double det=0.0, segno=0.0;
int passo, perno;
perno=1;
inizializzaMatrice(&subMatrix, matrix.lato - 1);
for (passo = 0; passo < matrix.lato; passo++)
{
segno=complemento(matrix, subMatrix, passo, perno);
det += segno * getElemento(matrix, passo, perno) * determinante(subMatrix);
}
deallocaMatrice(&subMatrix);
return det;
}
double complemento(Tmatrice originale, Tmatrice travaso, int riga, int colonna)
{
int i, j, subRiga, subColonna;
for (i = 0; i < travaso.lato; i++)
for (j = 0; j < travaso.lato; j++)
{
subRiga=i < riga ? i: i + 1;
subColonna=j < colonna ? j: j + 1;
setElemento(travaso, i, j, getElemento(originale, subRiga, subColonna));
}
return ((riga + colonna) % 2) == 0 ? 1.0: -1.0;
}
int invertibile(Tmatrice matrix, Tmatrice risultato)
{
double det, segno, subDet;
int i, j;
Tmatrice subMatrix;
if ((matrix.lato != risultato.lato) || (matrix.lato < 1))
return 0;
det=determinante(matrix);
if (fabs(det) < 1e-80)
{
return 0;
}
inizializzaMatrice(&subMatrix, matrix.lato - 1);
for (i=0; i < matrix.lato; i++)
{
for (j=0; j < matrix.lato; j++)
{
segno=complemento(matrix, subMatrix, i, j);
subDet=segno * determinante(subMatrix) * (1.0 / det);
setElemento(risultato, j, i, subDet);
}
}
deallocaMatrice(&subMatrix);
return 1;
}