Algoritimo pra Multiplicação de Matrizes

Publicado por Vanderson Lucio Rodrigues 17/12/2005

[ Hits: 56.530 ]

Homepage: http://www.vandersongold.com.br

Download mul_matriz.c




Esse programinha, faz a multiplicação entre duas matrizes que são alocadas dinamicamente. Está bem comentado e fácil de entedender. :)
[]'s

  



Esconder código-fonte

/* 
 * Esse Simples programa faz uma multiplicacao entre duas matrizes
 * utilizando alocacao dinaminca.
 * O Numero de linhas e coluna sao fornecidos pela entrada padrao, alem dos
 * campos das matrizes.
 * 
 * @autor: Vanderson Lucio   <vanderson.gold@gmail.com>
 *
 * Data: 08-08-2005 
 */

#include <stdio.h>
#include <stdlib.h>


/* aloca memoria para as matrizes  */
float **Alocar_matriz_real(int m, int n)
{
   float **v;  /* ponteiro para a matriz */
   int   i;    /* variavel auxiliar      */

   if (m < 1 || n < 1) { /* verifica parametros recebidos */
      printf ("** Erro: Parametro invalido **\n");
      return (NULL);
   }

   /* aloca as linhas da matriz */
   v = calloc (m, sizeof(float *));   /* Um vetor de m ponteiros para float */
   if (v == NULL) {
      printf ("** Erro: Memoria Insuficiente **");
      return (NULL);
   }

   /* aloca as colunas da matriz */
   for ( i = 0; i < m; i++ ) {
      v[i] =  calloc (n, sizeof(float));   /* m vetores de n floats */
      if (v[i] == NULL) {
         printf ("** Erro: Memoria Insuficiente **");
         return (NULL);
      }
   }

   return (v); /* retorna o ponteiro para a matriz */
}

/* Libera memoria ocupada pelas matrizes */
float **Liberar_matriz_real (int m, int n, float **v)
{
   int  i;  /* variavel auxiliar */

   if (v == NULL)
         return (NULL);

   if (m < 1 || n < 1) {  /* verifica parametros recebidos */
      printf ("** Erro: Parametro invalido **\n");
      return (v);
   }

   for (i = 0; i < m; i++)
         free (v[i]); /* libera as linhas da matriz */

   free (v);      /* libera a matriz (vetor de ponteiros) */

   return (NULL); /* retorna um ponteiro nulo */
}

/* Funcao para receber os dados que preencherao as matrizes */
float **ler_mat(int m, int n, float **v)
{
   int i, j;

   printf("Preencha a Matrix: \n");
   for (i = 0 ; i < m; i++ )
      for (j = 0; j < n; j++) {
         printf("Posicao a%d%d \n", i+1, j+1);
         scanf("%f", &v[i][j]);
      }
   printf("\n");

   return(v); 
}

/* Essa funcao faz a multiplicacao entre as matrize.
 * Retorna um matriz com resultado da multplicao
 * */
float **mult(int ma, int mb , int na, int nb, float **a, float **b, float **mr)
{
   int i, j , v;

   for (i = 0 ; i < ma; i++ )
      for (j = 0; j < nb; j++)
         for (v = 0; v < na; v++)
            mr[i][j] = mr[i][j] + a[i][v] * b[v][j];

   return(mr);
}

/* funcao pra imprimir na tela as matrizes  */
void imprime(int ma, int mb , int na, int nb , float **a, float **b, float **mr)
{
   int i, j;

   /* Impressao das Matrizes */
   printf("MATRIX A:\n");
   for (i = 0; i < ma; i++) {
      for ( j = 0; j < na; j++)
         printf("%.f ", a[i][j]);
      printf("\n");
   }
   printf("MATRIX B:\n");
   for (i = 0; i < mb; i++) {
      for ( j = 0; j < nb; j++)
         printf("%.f ", b[i][j]);
   printf("\n");
   }

   printf("MATRIX C:\n");
   for (i = 0; i < ma ; i++) {
      for ( j = 0; j < nb ; j++)
         printf("%4.f", mr[i][j]);
      printf("\n");
   }
}

/* funcao pra validar se e possivel fazer a multiplicao entre
 * as matrizes dadas
 */
int invalido(int na, int mb)
{
   if (na != mb)
      return -1;

   return 0;
}

/*
 * Essa e a funcao principal
 */
int main(int argc, char **argv)
{
   float **A;  /* matriz a ser alocada */
   float **B;  /* matriz a ser alocada */
   float **MR;  /* matriz a ser alocada */
   int la, lb, ca, cb;   /* numero de linhas e colunas da matriz */

   printf("Informe o Numero de Linhas  A : ");
   scanf("%d", &la);
   printf("Informe o Numero de Colunas A : ");
   scanf("%d", &ca);
   printf("Informe o Numero de Linhas  B : ");
   scanf("%d", &lb);
   printf("Informe o Numero de Colunas C : ");
   scanf("%d", &cb);

   if(invalido(ca, lb)) {
      fprintf(stderr, "Erro:\n");
      fprintf(stderr, "Numero de colunas da Matriz A deve ser igual ao Numero de Linhas da Matrix B\n");
      exit(EXIT_FAILURE);
   }

   /* Chama a funcao para alocar a matriz */
   A = Alocar_matriz_real (la, ca);
   B = Alocar_matriz_real (lb, cb);
   MR = Alocar_matriz_real (la, cb);
   
   /* Chama funcao pra preencher as matrizes  */
   A = ler_mat(la, ca, A);
   B = ler_mat(lb, cb, B);

   /* chama a funcao pra fazer muultiplicacao das matrizes */
   MR = mult(la, lb, ca, cb, A, B, MR);

   /* chama a funcao pra mostrar na tela o resultado da multiplicacao */
   imprime(la, lb , ca, cb, A, B, MR);
   
   /* desaloca a memoria, nao mais nescessaria */
   A = Liberar_matriz_real (la, ca, A);
   B = Liberar_matriz_real (lb, cb, B);
   MR = Liberar_matriz_real (la, cb, MR);

   return 0;
} /* fim do programa */

Scripts recomendados

O que são e como utilizar structs

programa que mostra o uso de registros em C. Cadastra 10 funcionarios

Simples uso da função rand()

De 10 a 1000

Uso do Comando Printf


  

Comentários
[1] Comentário enviado por doradu em 01/02/2010 - 13:31h

conversão inválida de void pra float

linhas 28 e 36

bug ao compilar

[2] Comentário enviado por joelpolese em 25/10/2010 - 09:12h

galera,

estou utilizando um programa semelhante a esse para testar meu cluster de alto desempenho pra finalizar meu TC, porém estou com alguns resultados estranhos.

Então, para confirmar alguém poderia me informar o tempo que levaria para processar uma matriz de 700 x 700 ou 40.000 x 40.000 ou 60.000 x 60.000, e assim por diante? (2 nodos processantes single core com ~512MB


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts