ho segnato con molti asterischi la parte di codice che secondo me da problemi:
se la parte di codice commentata da //traspongo la metto prima di //visualizza matrici il programma non fa nessun printf e si chiude...
se la metto dopo si esegue e va tutto bene
mi sapreste aiutare??
grazie
codice:
#include <stdio.h>
#include <stdlib.h>
struct matrice {
int r;
int c;
double ** m;
};
struct matrice crea_matrice(int r, int c); // r = righe, c = colonne
int moltiplica_matrici(struct matrice * c, struct matrice a, struct matrice b);
int trasponi_matrice(struct matrice * c, struct matrice a);
int stampa_matrice(struct matrice a);
int main (){
struct matrice x, xt, v, xtv;
struct matrice varianza;
x = crea_matrice(2,1);
xt = crea_matrice(x.c,x.r);
v = crea_matrice(x.r,x.r);
varianza = crea_matrice(1,1);
xtv = crea_matrice(xt.r,v.c);
//dati matrici
x.m[0][0] = 0.5;
x.m[1][0] = 0.5;
v.m[0][0] = 2; v.m[0][1] = 0.5;
v.m[1][0] = 0.5; v.m[1][1] = 3;
//traspongo **********************************************
if(!trasponi_matrice(&xt,x))
printf("errore...");
//visualizza matrici ******************************************
printf("\nx:\n");
stampa_matrice(x);
printf("\nxt:\n");
stampa_matrice(xt);
printf("\nv:\n");
stampa_matrice(v);
//xt*V*x
if(!moltiplica_matrici(&xtv,xt,v))
printf("errore...");
if(!moltiplica_matrici(&varianza,xtv,x))
printf("errore...");
printf("varianza %f",varianza.m[0][0]);
getchar();
return 1;
}
struct matrice crea_matrice(int r, int c){ // r = righe, c = colonne
int x,y;
struct matrice matrice;
matrice.r = r;
matrice.c = c;
matrice.m = (double **) malloc(r * sizeof(double *));
for(x=0;x<r;x++)
matrice.m[x] = (double *) malloc(c * sizeof(double));
for(x=0;x<r;x++)
for(y=0;y<c;y++)
matrice.m[x][y] = 0;
return matrice;
}
int moltiplica_matrici(struct matrice * c, struct matrice a, struct matrice b){
int x,y,i;
if(a.c != b.r)
return 0;
if(c->r != a.r || c->c != b.c)
return 0;
for(x=0;x<c->r;x++)
for(y=0;y<c->c;y++)
for(i=0;i<a.c;i++)
c->m[x][y] = c->m[x][y] + a.m[x][i]*b.m[i][y];
return 1;
}
int trasponi_matrice(struct matrice * c, struct matrice a){
int x,y;
if(c->r != a.c || c->c != a.r)
return 0;
for(x=0;x<c->r;x++)
for(y=0;y<c->c;y++)
c->m[y][x] = a.m[x][y];
return 1;
}
int stampa_matrice(struct matrice a){
int x,y;
for(x=0;x<a.r;x++){
for(y=0;y<a.c;y++)
printf("%f\x09",a.m[x][y]);
printf("\n");
}
return 1;
}