Produto de duas matrizes alocadas dinamicamente
Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)
[ Hits: 6.981 ]
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);
}
Script em C++ de uma Lista Estática.
Simulador do Sorteio da Mega Sena
Retornar o montante de um capital aplicado a juros compostos
Manipulando argumentos com getopt_long
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Como fazer a instalação do Samba
Como fazer a conversão binária e aplicar as restrições no Linux
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (27)









