Enrere Mòdul 5
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Producte de matrius

En aquesta pràctica en la què calcularem el producte de dos matrius entrades pel teclat, aprendrem a fer servir les variables indexades multidimensionals (matrius).

 

Desenvolupament de la pràctica

Aquest programa calcularà el producte de dues matrius. 

Si tenim dues matrius A i B, la primera de n files i m columnes, i la segona de m files i p columnes (fixeu-vos que és necessari que el nombre de columnes de la primera matriu ha de coincidir amb el nombre de files de la segona matriu), el producte d'aquestes dues matrius es defineix com una matriu R de n files i p columnes (tantes files com la primera matriu i tantes columnes com la segona), on cada element es calcula amb la següent expressió:

rij=ai0b0j+ai1b1j+...+ai(m-1)b(m-1)j

El producte de matrius és una operació bàsica i molt important que té un important nombre d'aplicacions. 

Creeu un nou arxiu del tipus C++ anomenat m5p06.cc i escriviu el següent codi:

// m5p06.cc - Càlcul del producte de dues matrius -

#include <stdio.h>
#define MAX_FILES 10
#define MAX_COLUMNES 10
int main(){

   double a[MAX_FILES][MAX_COLUMNES];
   double b[MAX_FILES][MAX_COLUMNES];
   double r[MAX_FILES][MAX_COLUMNES]={0};

   int fa, ca; //files i columnes d'A
   int fb, cb; //files i columnes d'B
   int fr, cr; //files i columnes d'R

   int i,j,k;

   printf("\nIntroduïu el nombre de files de la matriu A:");
   scanf("%d", &fa);

   printf("\nIntroduïu el nombre de columnes d'A:");
   scanf("%d", &ca);

   fb=ca; //el nombre de files de B=columnes d’A

   printf("\nLa matriu B tindrà %d files\n",ca);

   printf("\nIntroduïu el nombre de columnes de B:");
   scanf("%d", &cb);

   //introducció dels elements d’A

   for (i=0;i<fa;i++){
      for(j=0;j<ca;j++){
         printf("a[%d,%d]=",i,j);
         scanf("%lf",&a[i][j]);
      }
   }


   //introducció dels elements d’B

   for (i=0;i<fb;i++){
      for(j=0;j<cb;j++){
         printf("b[%d,%d]=",i,j);
         scanf("%lf",&b[i][j]);
      }
   }


   //càlcul del producte A*B

   fr=fa;cr=cb; //càlcul de les dimensions de r

   for(i=0;i<fr;i++){
      for(j=0;j<cr;j++){
         for(k=0;k<fb;k++){
           r[i][j]=r[i][j]+a[i][k]*b[k][j];
         }
      }
   }

   // resultat

   for (i=0;i<fr;i++){
      for(j=0;j<cr;j++){
         printf("\nr[%d,%d]=%lf",i,j,r[i][j]);
      }
   }
   return 0;
}

 

Captura de l'execució del programa.

 

 

El primer que podem observar en aquest programa és la definició de les macros MAX_FILES i MAX_COLUMNES, ambdues amb el valor 10. És una bona pràctica definir aquests tipus de macros per tal de poder modificar ràpidament el codi en cas que necessitem augmentar o disminuir la mida de les matrius.

Es defineixen tres matrius de dues dimensions anomenades a, b, i r. Les dos primeres contindran les matrius que volem multiplicar i l'última el resultat del producte. És interessant observar que la tercera matriu és inicialitzada a 0 d'aquesta forma:

 
double r[MAX_FILES][MAX_COLUMNES]={0};

No és necessari escriure més que un 0.

A continuació es demana a l'usuari el nombre de files i columnes de la primera matriu, així com el nombre de columnes de la segona matriu. El nombre de files de la segona matriu no es demana, ja que coincideix amb el nombre de columnes de la primera matriu.

Després hi ha dos dobles bucles que serveixen per omplir els valors dels elements de les dues matrius.

El càlcul del producte es fa amb el següent triple bucle:

 
//càlcul del producte A*B 
 

    fr=fa;cr=cb;      //càlcul de les dimensions de r

    for(i=0;i<fr;i++){
        for(j=0;j<cr;j++){                     
            for(k=0;k<fb;k++){
                 r[i][j]=r[i][j]+a[i][k]*b[k][j];
            }
        }
    }

La part marcada correspon realment al càlcul de l'element rij.