/* * Biblioteca de Funcoes para manipulação de matrizes *---------------------------------------------------------------- * Autores: * - Gustavo Sverzut Barbieri - Eng. Computação - Unicamp * - Ivens Prates Teles Alves - Eng. Computação - Unicamp */ #include "lib_matriz.h" /* Funcoes Básicas de Matriz ------------------------------------------------------------------------*/ /* *Funcao: matCria *Descrição: Retorna matriz de mxn *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * int m: número de linhas da matriz a ser criada * int n: número de colunas da matriz a ser criada * char nome[]: nome a ser atribuido à matriz criada *Retorno: Apontador para matriz criada */ Matriz *matCria(int nl, int nc, char nome[]) { Matriz *m = NULL; int i; if ( (m = calloc(1,sizeof(Matriz))) == NULL) { Aviso(MSG0 ,"matCria"); exit; } else { if ( (m->info = (double **) calloc(nl, sizeof(double *))) == NULL) { Aviso(MSG0,"matCria"); exit; } m->nl=nl; m->nc=nc; strcpy(m->nome,nome); for (i=0; iinfo[i]= (double *) calloc(nc,sizeof(double))) == NULL) { Aviso(MSG0,"matCria"); exit; } } return(m); } /* *Funcao: matDestroi *Descrição: Libera espaço da matriz m *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m: Apontador para matriz a ser liberada *Retorno: nenhum */ void matDestroi(Matriz *m) { int i; if ( m != NULL) { for (i=0; i < m->nl; i++) if ( m->info[i] != NULL ) free(m->info[i]); free(m); } } /* *Funcao: matSoma *Descrição: Soma matrizes apontadas por m1 e m2 *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m1: Apontador para matriz a ser somada * Matriz *m2: Apontador para matriz a ser somada * char nome[]: nome a ser atribuido à matriz criada *Retorno: Apontador para matriz com a soma */ Matriz *matSoma(Matriz *m1, Matriz *m2, char nome[]) { Matriz *m = NULL; int i,j; if ((m1 != NULL) && (m2 != NULL)) { if ((m1->nc == m2->nc) && (m1->nl == m2->nl)) { m = matCria(m1->nl, m1->nc, nome); 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]; } else if ((m1->nc != m2->nc) || (m1->nl != m2->nl)) Aviso(MSG2,"matSoma"); } else Aviso(MSG1,"matSoma"); return m; } /* *Funcao: matSomaEscalar *Descrição: Soma matrizes apontadas por m1 e o número n *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m1: Apontador para matriz a ser somada * double n: Numero a ser somado à matriz * char nome[]: nome a ser atribuido à matriz criada *Retorno: Apontador para matriz com a soma */ Matriz *matSomaEscalar(Matriz *m1, double n, char nome[]) { int i,j; Matriz *m=NULL; if (m1 != NULL) { m = matCria(m1->nl, m1->nc, nome); for (i=0; i < m1->nl; i++) for (j=0; j < m1->nc; j++) m->info[i][j] = m1->info[i][j] + n; } else Aviso(MSG1,"matSomaEscalar"); return m; } /* *Funcao: matMultiplica *Descrição: Multiplica matrizes apontadas por m1 e m2 *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m1: Apontador para matriz a ser multiplicada * Matriz *m2: Apontador para matriz a ser multiplicada * char nome[]: nome a ser atribuido à matriz criada *Retorno: Apontador para matriz com a multiplicação */ Matriz *matMultiplica(Matriz *m1, Matriz *m2, char nome[]) { Matriz *m = NULL; int i,j,k; if ((m1 != NULL) && (m2 != NULL)) { if ( m1->nc == m2->nl ) { m = matCria(m1->nl, m2->nc, nome); 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]; } } else if (m1->nc != m2->nl) Aviso(MSG2,"matMultiplica"); } else Aviso(MSG1,"matMultiplica"); return m; } /* *Funcao: matMultiplicaEscalar *Descrição: Multiplica matriz por escalar *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m1: Apontador para matriz a ser multiplicada * double n: escalar que multiplica a matriz * char nome[]: nome a ser atribuido à matriz criada *Retorno: Apontador para matriz com o resultado */ Matriz *matMultiplicaEscalar(Matriz *m1, double n, char nome[]) { int l,c; Matriz *m = NULL; if (m1 != NULL) { m = matCria(m1->nl,m1->nc,nome); for (l=0; l < m1->nl; l++) for (c=0; c < m1->nc; c++) m->info[l][c] = m1->info[l][c] * n; } else Aviso(MSG1,"matMultiplicaEscalar"); return m; } /* Matrizes Especiais -------------------------------------------------------------------------------*/ /* *Funcao: matHilbet *Descrição: Retorna matriz de Hilbert nxn *Autor: Ivens Prates Telles Alves *Data: 2001-10-01 *Parametros: * int n: tamanho da matriz de Hilbert * char nome[]: nome a ser atribuido à matriz criada *Retorno: Apontador para matriz de Hilbert criada */ Matriz *matHilbert(int n, char nome[]) { int i,j; Matriz *a; a = matCria(n,n,nome); for(i=1;i<=n; i++) for(j=1;j<=n; j++) a->info[i-1][j-1] = (double) 1/(i+j-1); return(a); } /* *Funcao: matRandom *Descrição: Retorna matriz nxn de números aleatórios entre x0 e x1 *Autor: Ivens Prates Telles Alves *Data: 2001-10-01 *Modificado: * Gustavo Sverzut Barbieri 2001-10-01 *Parametros: * int m: número de linhas da matriz a ser criada * int n: número de colunas da matriz a ser criada * char nome[]: nome a ser atribuido à matriz criada * double x0: limite inferior dos números aleatórios * double x1: limite superior dos números aleatórios *Retorno: Apontador para matriz criada */ Matriz *matRandom(int m, int n, char nome[], double x0, double x1) { int i,j; Matriz *a; a = matCria(m,n,nome); srand(time(NULL)); for(i=0;iinfo[i][j] = x0+ ((x1-x0)* (double)(rand()/(RAND_MAX+1.0))); return(a); } /* Funcoes para Ler/Escrever Matrizes --------------------------------------------------------------*/ /* *Funcao: matImprime *Descrição: Imprime matriz com 'formato' *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m: Apontador para matriz a ser impressa * char formato[]: formato a ser impresso na tela, deve-se incluir, também os espaços e tabulações *Retorno: nenhum */ void matImprime(Matriz *m, char formato[]) { int l,c; if (m != NULL) { fprintf(stdout,"%s(%dx%d)=\n", m->nome,m->nl, m->nc); for (l=0; l < m->nl; l++) { for (c=0; c < m->nc; c++) fprintf(stdout,formato, m->info[l][c]); fprintf(stdout,"\n"); } } else Aviso(MSG1,"matImrpime"); } /* *Funcao: matImprimeLatex *Descrição: Imprime matriz com 'formato' em formato LaTex *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m: Apontador para matriz a ser impressa * char formato[]: formato a ser impresso na tela, deve-se incluir, também os espaços e tabulações *Retorno: nenhum */ void matImprimeLatex(Matriz *m, char formato[]) { int l,c; if ( m != NULL) { fprintf(stdout,"\\[%s_{%d\\times%d}=\n\\left(\\begin{array}{", m->nome,m->nl, m->nc); if (m->nc < m->nl) { /* Imprime a transposta */ for (l=0; l < m->nl; l++) printf("r"); printf("}\n"); for (c=0; c < m->nc; c++) { for (l=0; l < m->nl; l++) { fprintf(stdout,formato, m->info[l][c]); if (l < m->nl-1) fprintf(stdout," & "); } fprintf(stdout,"\\\\ \n"); } fprintf(stdout,"\\end{array}\\right)^{T}\\]\n\n\n"); } else { for (c=0; c < m->nc; c++) printf("r"); printf("}\n"); for (l=0; l < m->nl; l++) { for (c=0; c < m->nc; c++) { fprintf(stdout,formato, m->info[l][c]); if (c < m->nc-1) fprintf(stdout," & "); } fprintf(stdout,"\\\\ \n"); } fprintf(stdout,"\\end{array}\\right)\\]\n\n\n"); } } else Aviso(MSG1,"matImprimeLatex"); } /* *Funcao: matLer *Descrição: Lê matriz do stdin *Autor: Gustavo Sverzut Barbieri *Data: 2001-10-01 *Parametros: * Matriz *m: Apontador para matriz a ser lida *Retorno: nenhum */ void matLer(Matriz *m) { int l,c; fprintf(stderr,"Lendo matriz %s(%dx%d):\n",m->nome,m->nl,m->nc); for (l=0; l < m->nl; l++) for (c=0; c < m->nc; c++) scanf("%lf",&(m->info[l][c])); }