Salve,
ho un problema con un programma scritto in C. Ho bisogno di calcolare l'inversa in C, quando però compilo da terminale Ubuntu mi esce l'errore:
"incompatible type when returning type 'double' b but float * was expected"
Premetto che il codice "base" l'ho trovato su internet, e l'ho modificato utilizzando un unico blocco di memoria (in quanto mi serve in seguito per delle procedure di ottimizzazione):
#define MATRIX float*
MATRIX inversa(int n, MATRIX X) {
MATRIX a = alloc_matrix(n,n);
MATRIX inversa= alloc_matrix(n,n);
float m, pivot, det;
int i, j, k;
/* Uso una matrice di appoggio `a' */
/* b e' inizializzata all'identita' */
//a=alloca_matrice(n);
for (i = 0; i < n*n; i++) {
a[i]=X[i];
inversa[i] = 0.0;
inversa[i*(n+1)+i] = 1.0;
}
/* Ax = b -> LUx = b -> Ux = inv(L)b */
/* Fase I: moltiplica per l'inversa di L */
for (k = 0; k < n; k++) {
pivot = a[k*(n+1)+k];
if (fabs(pivot) < 5e-16)
return 0.0;
for (i = k + 1; i < n; i++) {
m = a[i*(n+1)+k] / pivot;
for (j = 0; j < n; j++) /* Ottimizzare: come? */
inversa[i*(n+1)+j] -= m * inversa[k*(n+1)+j];
for (j = k; j < n; j++)
a[i*(n+1)+j] -= m * a[k*(n+1)+j];
}
}
/* Ux = inv(L)b -> x = inv(U)(inv(L)b) */
/* Fase II: moltiplica per inv(U) */
/* = sostituzione all'indietro */
/* Il det. e` dato dal prodotto degli U_ii */
det = 1.0;
for (i = n - 1; i >= 0; i--) {
pivot = a[i*(n+1)+i];
if (fabs(pivot) < 5e-16)
return 0.0;
det *= pivot;
for (k = 0; k < n; k++) {
m = inversa[i*(n+1)+k];
for (j = i + 1; j < n; j++)
m -= a[i*(n+1)+j] * inversa[j*(n+1)+k];
inversa[i*(n+1)+k] = m / pivot;
}
}
return inversa;
}
Non riesco a capire dove sbaglio