Mnożenie macierzy wytłumaczymy na następującym programie napisanym w języku c:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int n; // Wymiar macierzy
long **m; // Tablica tablic (wierszy)
} matrix; // Definicja nowego typu matrix (struktury)
// Funkcja odczytujaca dwie macierze kwadratowe a i b.
// Wczesniej odczytywana jest informacja o wymiarze macierzy
// i alokowana jest stosowna pamiec.
void readmatrix (matrix * a, matrix * b)
{
int i, j;
scanf ("%d", &(a->n));
b->n = a->n;
// Alokacja pamieci na a;
a->m = (long **) malloc ((a->n) * sizeof (long *));
for (i = 0; i < a->n; i++)
{
a->m[i] = (long *) malloc ((a->n) * sizeof (long *));
}
// Alokacja pamieci na b;
b->m = (long **) malloc ((b->n) * sizeof (long *));
for (i = 0; i < b->n; i++)
{
b->m[i] = (long *) malloc ((b->n) * sizeof (long *));
}
for (i = 0; i < a->n; i++)
for (j = 0; j < a->n; j++)
scanf ("%ld", &(a->m[i][j])); // Odczytywanie wspolrzednych a
for (i = 0; i < b->n; i++)
for (j = 0; j < b->n; j++) // Odczytywanie wspolrzednych b
scanf ("%ld", &(b->m[i][j]));
}
// Funckja mnozaca macierze a i b
// zwracana jest macierz bedaca iloczynem
matrix mulmatrix (const matrix * a, const matrix * b)
{
matrix w;
int x, y, i;
long z;
w.n = a->n;
w.m = (long **) malloc ((w.n) * sizeof (long *));
for (i = 0; i < w.n; i++)
{
w.m[i] = (long *) malloc ((w.n) * sizeof (long *));
}
for (x = 0; x < w.n; x++)
for (y = 0; y < w.n; y++)
{
z = 0;
for (i = 0; i < w.n; i++)
z = z + a->m[x][i] * b->m[i][y];
w.m[x][y] = z;
}
return w;
}
// Prosta funckja wyswietlajaca macierz na ekranie
void wyswietl (matrix * m)
{
int i, j;
for (i = 0; i < m->n; i++)
{
for (j = 0; j < m->n; j++)
printf ("%8ld", m->m[i][j]);
printf ("\n");
}
printf ("\n\n");
}
matrix a, b, w;
// Macierze zczytywane sa ze standartowego wejscia
int main (void)
{
readmatrix (&a, &b);
printf ("Macierz A:\n\n");
wyswietl (&a);
printf ("Macierz B:\n\n");
wyswietl (&b);
w = mulmatrix (&a, &b);
printf ("Macierz A*B:\n\n");
wyswietl (&w);
return 0;
}
Zakładamy że macierze które chcemy pomnożyć, są kwadratowe.
Iloczyn macierzy nie jest przemienny.
Mnożenie macierzy jest często przydatne, na przykład w silnikach graficznych, gdzie aby obrócić jakis obiekt, należy pomnożyć jego współrzędne przez macierz
obrotu/translacji lub inną.
Najpierw definiujemy macierz. Jest to strukura składająca się z elementów: "n" - rozmiar macierzy, oraz dynamicznie alokowanej "tablica tablic elementów long", czyli istotnie naszej macierzy.
Funkcja readmatrix pobiera jako argumenty dwa wskaźniki na matrix, w locie alokuje pamięć i odczytuje macierze ze standartowego wejścia( _stdin ).
Funkcja mulmatrix wykonuje całą czarną robotę związaną z mnożeniem macierzy. Jako argumenty przekazujemy wskaźniki. Tworzymy nową macierz "w", do której
zapisujemy wynik iloczynu, a następnie zwracamy ją. Funkcja wyświet raczej nie wymaga szczególnego komentarza.
Przykładowe wejście do programu to : 3
1 2 3
4 5 6
7 8 9
3 2 1
6 5 3
9 8 7
Na wyjsciu powinniśmy otrzymać:
Macierz A:
1 2 3
4 5 6
7 8 9
Macierz B:
3 2 1
6 5 4
9 8 7
Macierz A*B:
42 36 30
96 81 66
150 126 102
![]() |
|
![]() |
![]() |
|||||||||||||||||||||||||||
![]() |
![]() |
|||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||
![]() |
![]() |