Produto de duas matrizes alocadas dinamicamente
Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)
[ Hits: 6.732 ]
Homepage: http://www.danielmoreira.wordpress.com
Faz o produto de duas matrizes alocadas dinamicamente. Os valores das matrizes são lidos de um arquivo chamado matrizes.txt, que você pode criar conforme especificado no arquivo principal.c.
O programa inclui as funções:
Matriz* cria (int m, int n); // Cria a matriz
void imprime(Matriz *A); // Imprime os elementos da matriz
Matriz* produto(Matriz *A, Matriz *B); // faz o produto das matrizes A e B
float acessa (Matriz* mat, int i, int j); // retorna um valor específico da matriz
void atribui (Matriz* mat, int i, int j, float v); // atribui um valor à uma posição específica da matriz
void libera (Matriz* mat); // libera a memória alocada
int get_nlin (Matriz* mat); // retorna número de linhas
int get_ncol (Matriz* mat); // retorna número de colunas
No programa principal temos a matriz A[m,n] e fazemos B[n,m], porque o objetivo é obter uma matriz quadrada. Mas a função produto funciona para quaisquer matrizes A[m,n] e B[p,q] desde que n=p.
//Este é somente o arquivo matriz.c # include <stdio.h> # include <stdlib.h> # include "matriz.h" struct matriz { int lin; int col; float** v; }; Matriz* cria(int m, int n){ int i; Matriz* mat=(Matriz*)malloc(sizeof(Matriz)); if(mat==NULL){ printf("Memoria Insuficiente!\n"); exit(1); } mat->lin=m; mat->col=n; mat->v=(float**)malloc(m*sizeof(float*)); for (i=0; i<m; i++) { mat->v[i]=(float*)malloc(n*sizeof(float)); } return(mat); } void imprime(Matriz *A){ int i, j; for(i=0; i<(A->lin); i++){ for(j=0; j<(A->col); j++){ printf("%f ", A->v[i][j]); } printf("\n"); } } Matriz* produto(Matriz *A, Matriz *B){ int i=0, j=0, a, cont; float s=0; Matriz *C=cria(get_nlin(A), get_ncol(B)); for(cont=0; cont<(get_nlin(C)*get_ncol(C)); cont++){ for(a=0; a<get_ncol(A); a++){ s=s+(A->v[i][a]*B->v[a][j]); } C->v[i][j]=s; s=0; if( j==(get_ncol(C)-1) ){ i++; j=0; }else{ j++; } } return(C); } float acessa (Matriz* mat, int i, int j){ if(i<0 || i>(mat->lin) || j<0 || j>(mat->col) ){ printf("Acesso Invalido."); exit(1); } return(mat->v[i][j]); } void atribui (Matriz* mat, int i, int j, float v){ if(i<0 || i>(mat->lin) || j<0 || j>(mat->col) ){ printf("Acesso Invalido."); exit(1); } mat->v[i][j]=v; } void libera (Matriz* mat) { int i; for(i=0; i<mat->lin; i++) { free(mat->v[i]); } free(mat->v); free(mat); } int get_nlin (Matriz* mat){ return(mat->lin); } int get_ncol (Matriz* mat){ return(mat->col); }
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Vou voltar moderar conteúdos de Dicas e Artigos (1)
SysAdmin ou DevOps: Qual curso inicial pra essa área? (3)
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta