Algoritimo para multiplicação de matrizes


Autor/fonte: Vanderson Lucio
E-mail/Url: http://www.vivaolinux.com.br/scripts/verScript.php?codigo=1570



Digg del.icio.us

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

Script:

/*
* 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 =  calloc (n, sizeof(float));   /* m vetores de n floats */
      if (v == 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); /* 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[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[j] = mr[j] + a[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[j]);
      printf("\n");
   }
   printf("MATRIX B:\n");
   for (i = 0; i < mb; i++) {
      for ( j = 0; j < nb; j++)
         printf("%.f ", b[j]);
   printf("\n");
   }

   printf("MATRIX C:\n");
   for (i = 0; i < ma ; i++) {
      for ( j = 0; j < nb ; j++)
         printf("%4.f", mr[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 */




Enviado por xKuRt em 29/11/2006 às 09:01


Avaliação

Esta publicação ainda não foi avaliada!


Avaliar:


A avaliação de publicações é restrita a membros cadastrados e logados no nosso site.



Comentários

Este artigo ainda não foi comentado ou o(s) comentário(s) que foi(ram) enviado(s) a ele ainda não foi(ram) publicado(s).


Envio de comentário:




  

Terça, 28 de Abril de 2015




Top 5 membros

Últimos membros online

Últimos membros cadastrados



Capa do livro
Fundamentos da Ciência da Computação


Capa do livro
PHP para Quem Conhece PHP


Capa do livro
Gestão de Tecnologia da Informação - Governança de Ti - Arquitetura e Alinhamento entre Sistemas de Informação e o Negócio





Hostnet

IMD