Умножение на матрици - алгоритъм и програма
Нека имаме две правоъгълни матрици, над които трябва да се извърши операцията умножение на матрици.
Умножението на матрици A и B е дефинирано само когато A е съгласувана с B, т.е. когато броя на стълбове на A е равен на броя на редове на B.
Най-често срещаното умножение на две натрици е умножение ред по стълб.
Ако за произведение от две числа важи правилото за комутативност a*b = b*a, то при умножение на две матрици A и B тяхното произведение не е комутативно , т.е. A*B<>B*A.
Тук се разглежда само един алгоритъм за умножение на две матрици.
Произведението от началните две матрици A и B е нова матрица C.
Всеки елемент от ред на матрица A се умножава последователно с всеки елемент от стълбовете на матрица B.
Сумата на всяко от тези произведения дава един елемент от реда на матрица C с номер, съвпадащ с този на матрица A.
Елементите от първия ред на A, умножен с всички стълбове на B, дава всички елементи от първия ред на матрица C и т.н.
Следващата примерна програма илюстрира решена задача за умножение на матрици:
#include <iostream>
using namespace std;
//obs-br=3 - pyrwata matrica e s 4 reda 3 koloni, a wtorata s 3 reda 2 koloni
int main()
{ int const obs_br=3, br_red=4, br_kol=2, razmer=10;
//razmerite za broj redowe i koloni sa deklarirani kato konstanti
//wywevdane stojnost na element move da se osyshestwi:
//a) pri deklarirane; b) da se wywevdat ot klawiaturata; c) kato sluchajni chisla
int mas1[br_red][obs_br] = { {1,7,4}, {0,9,4}, {8,8,2}, {4,5,5} };
int mas2[obs_br][br_kol] = {{1,7},{1,1},{5,2}};
int mas3[br_red][br_kol];
int i,j,k, proiz;
cout<<"Imate dwe matrici s razmeri [4][3] i [3][2], sydyrvashi estestweni\n";
cout<<"chisla ot interwala [0..9]. Da se systawi programa, chez koqto se\n";
cout<<"wywevdat stojnosti na elementi w dwete matrici i se izwevda\n";
cout<<"rezlultata ot tqhnoto proizwedenie.\n";
//inicializirane na nowiq dwumeren masiw ( matrica) - wseki element e 0
for( i = 0; i < br_red; i++)
{ for( j = 0; j < br_kol; j++) { mas3[i][j]=0; }
}//for i
//Priswoqwane/wywevdane i pechat stojnosti za matrica 1
cout<<("Stojnosti w matrica 1: \n");
for( i = 0; i < br_red; i++)
{for( j = 0; j < obs_br; j++)
{//cout<<"Wywedete stojnost za element ["<<i<<"]["<<j<<"]: ";cin>>mas1[i][j];
mas1[i][j]=rand()%razmer;// sluchajni chisla ot interwala za element na matrica
cout<<" "<<mas1[i][j];} //izwevda stojnostta za wseki otdelen element
cout<<endl;
} //for i
//Priswoqwane/wywevdane i pechat stojnosti za matrica 2
cout<<("Stojnosti w matrica 2: \n");
for( i = 0; i < obs_br; i++)
{for( j = 0; j < br_kol; j++)
{ //cout<<"Wywedete stojnost za element ["<<i<<"]["<<j<<"]: ";cin>>mas2[i][j];
mas2[i][j]=rand()%razmer;//sluchajni chisla ot interwala
cout<<" "<<mas2[i][j];} //izwevda stojnostta za wseki otdelen element
cout<<endl;
}//for i
//umnovenie na 2-te matrici red po stylb
for( i = 0; i < br_red; i++)
{for( j = 0; j < br_kol; j++)
{cout<<"mas3["<<i<<"]["<<j<<"] = ";
for( k = 0; k < obs_br; k++)
//proizwedenie e suma ot proizwedeniqta red * stylb na 2-te matrici
{proiz=mas1[i][k]*mas2[k][j];
cout<<" + "<<proiz;//izwevda otdelnite proizwedeniq
mas3[i][j] += proiz;//natrupwa sumata ot proizwedeniq za element na matrica
}//for k
cout<<" = "<< mas3[i][j]<<endl;
}//for j
}//for i
cout<<("Rezultat ot umnovenie na dwete matrici e matrica 3: \n");
for( i = 0; i < br_red; i++)
{ for( j = 0; j < br_kol; j++) { cout<<" "<<mas3[i][j]; }
cout<<endl;//preminawane na now red
}//for i
system("pause");
return 0;
} // kraj na programa umnovenie na matrici
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.
Начало на страницата