Produto de duas matrizes alocadas dinamicamente

Publicado por Daniel Moreira dos Santos (última atualização em 31/08/2009)

[ Hits: 6.200 ]

Homepage: http://www.danielmoreira.wordpress.com

Download produto.tar




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.

  



Esconder código-fonte

//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);
}

Scripts recomendados

Sintetizador sonoro que toca redez vouz 4

Mini-editor de texto intuitivo em ncurses

Retirar ocorrências de uma substring dentro de uma string

Utilizando acentuação na linguagem C

Matrizes


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts