Produto de duas matrizes alocadas dinamicamente
Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)
[ Hits: 6.750 ]
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); }
Agenda eletronica com banco de dados em arquivo texto
Vários pacotes de ping disparados contra o host
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)