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:




  

Sexta, 28 de Novembro de 2014




Leitura recomendada

Linguagem C na Prática

Top 5 membros

Últimos membros online

Últimos membros cadastrados



Capa do livro
Neuromancer 25


Capa do livro
Crimes Cibernéticos: Ameaças e Procedimentos de Investigação


Capa do livro
Organização e Projeto de Computadores





Hostnet

IMD