#include "matriz.h" #define naoimplementada(funcao) printf(">%s<--> Nao implementada\n",funcao); #define new(type,count) (type *) calloc(count,sizeof(type)) #define alocaverifica(elemento,tipo,numero,nfuncao) if ( (elemento = new(tipo,numero)) == NULL) comTrataErro(MSG1,nfuncao); Matriz *matCria(int nl, int nc) { Matriz *m = NULL; int i; alocaverifica(m,Matriz,1,"matCria") else { alocaverifica(m->info,int *,nl,"matCria"); m->nl=nl; m->nc=nc; for (i=0; iinfo[i],int,nc,"matCria") } return(m); } MatrizL *matlCria(int nl, int nc) { MatrizL *ml = NULL; int i,j=0; alocaverifica(ml,MatrizL,1,"matlCria") else { alocaverifica(ml->info, int, nl*nc, "matlCria"); alocaverifica(ml->tblin, int, nl, "matlCria"); ml->nl=nl; ml->nc=nc; for (i=0; i<(nl*nc); i+=nc) ml->tblin[j++] = i; } return(ml); } void matDestroi(Matriz *m) { int i; if ( m == NULL) comAviso(AVS1,"matDestroi"); else { for (i=0; i < m->nl; i++) if ( m->info[i] == NULL ) comAviso(AVS1,"matDestroi"); else free(m->info[i]); free(m); } } void matlDestroi(MatrizL *m) { if ( m == NULL ) comAviso(AVS1,"matlDestroi"); else { if (m->tblin == NULL) comAviso(AVS1,"matlDestroi"); else free(m->tblin); if (m->info == NULL) comAviso(AVS1,"matlDestroi"); else free(m->info); free(m); } } Matriz *matSoma(Matriz *m1, Matriz *m2) { Matriz *m = NULL; int i,j; if ((m1 == NULL) || (m2 == NULL)) { comAviso(AVS1,"matSoma"); return NULL; } if ((m1->nc != m2->nc) || (m1->nl != m2->nl)) { comAviso(AVSMAT1,"matSoma"); return NULL; } m = matCria(m1->nl, m1->nc); /* Nao precisa conferir, pois se nao conseguir alocar memoria, o programa termina */ for (i=0; i < m1->nl; i++) for (j=0; j < m2->nc; j++) m->info[i][j] = m1->info[i][j] + m2->info[i][j]; return m; } MatrizL *matlSoma(MatrizL *m1, MatrizL *m2) { MatrizL *m = NULL; int i; if ((m1 == NULL) || (m2 == NULL)) { comAviso(AVS1,"matlSoma"); return NULL; } if ((m1->nc != m2->nc) || (m1->nl != m2->nl)) { comAviso(AVSMAT1,"matlSoma"); return NULL; } m = matlCria(m1->nl, m1->nc); for (i=0; i < (m1->nl * m1->nc); i++) m->info[i] = m1->info[i] + m2->info[i]; return m; } Matriz *matMultiplica(Matriz *m1, Matriz *m2) { Matriz *m = NULL; int i,j,k; if ((m1 == NULL) || (m2 == NULL)) { comAviso(AVS1,"matMultiplica"); return NULL; } if ( m1->nc != m2->nl ) { comAviso(AVSMAT1,"matMultiplica"); return NULL; } m = matCria(m1->nl, m2->nc); for (i=0; i < m1->nl; i++) for (j=0; j < m2->nc; j++) { m->info[i][j] = 0; for (k=0; k < m1->nc; k++) m->info[i][j] += m1->info[i][k] * m2->info[k][j]; } return m; } MatrizL *matlMultiplica(MatrizL *m1, MatrizL *m2) { MatrizL *m = NULL; int i,j,k; if ((m1 == NULL) || (m2 == NULL)) { comAviso(AVS1,"matlMultiplica"); return NULL; } if ( m1->nc != m2->nl ) { comAviso(AVSMAT1,"matlMultiplica"); return NULL; } m = matlCria(m1->nl, m2->nc); for (i=0; i < m1->nl; i++) for (j=0; j < m2->nc; j++) { m->info[matlInd(m,i,j)] = 0; for (k=0; k < m1->nc; k++) m->info[matlInd(m,i,j)] += m1->info[matlInd(m1,i,k)] * m2->info[matlInd(m2,k,j)]; } return m; } Matriz *matTransposta(Matriz *m) { Matriz *mt = NULL; int i,j; if (m == NULL) comAviso(AVS1,"matTransposta"); else { mt = matCria(m->nc, m->nl); for (i=0; i < mt->nl; i++) for (j=0; j < mt->nc; j++) mt->info[i][j] = m->info[j][i]; } return mt; } MatrizL *matlTransposta(MatrizL *m) { MatrizL *mt = NULL; int i,j; if (m == NULL) comAviso(AVS1,"matlTransposta"); else { mt = matlCria(m->nc, m->nl); for (i=0; i < mt->nl; i++) for (j=0; j < mt->nc; j++) { mt->info[matlInd(mt,i,j)] = m->info[matlInd(m,j,i)]; } } return mt; } Matriz *matEscala(Matriz *m, int x) { Matriz *me = NULL; int i,j; if (m == NULL) comAviso(AVS1,"matEscala"); else { me = matCria(m->nl,m->nc); for (i=0; i < m->nl; i++) for (j=0; j < m->nc; j++) me->info[i][j] = m->info[i][j] * x; } return me; } MatrizL *matlEscala(MatrizL *m, int x) { MatrizL *me = NULL; int i; if (m == NULL) comAviso(AVS1,"matlEscala"); else { me = matlCria(m->nl,m->nc); for (i=0; i < (m->nl * m->nc); i++) me->info[i] = m->info[i] * x; } return me; } /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */