Produto de duas matrizes alocadas dinamicamente
Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)
[ Hits: 7.051 ]
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);
}
Teste de desempenho com números primos em C (corrigido)
Exibi os números primos de um numero recebido pelo usuário, sem estrutura de repetição
Nenhum comentário foi encontrado.
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Faça suas próprias atualizações de pacotes/programas no Void Linux e torne-se um Contribuidor
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Utilizando a Ferramenta xcheckrestart no Void Linux
Pisando no acelerador do Linux Mint: Kernel XanMod, zRAM e Ajustes de Swap
Como compilar kernel no Linux Mint
Abrir um arquivo URL pelo Clipper (9)
Seno, Coseno, Tangente em CLIPPER (1)
Inserir uma URL num arquvo pelo Ubuntu (CLIPPER) (0)
VMWare Player não conecta na rede nem consigo intercambiar arquivos (1)









