Матрица - квадратна, триъгълна, диагонална, адюнгирано количество
Съдържание
симетрична матрица
триъгълна матрица
диагонална матрица
адюнгирано количество
събиране на матрици
умножение на матрици
транспониране на матрица
В математиката, матрица представлява правоъгълна таблица от елементи, най-често числа (числова матрица).
Матрица от тип m × n над поле (например реални или рационални числа) F се нарича матрица,
елементите на която са от полето F и има m реда и n стълба.
Обикновено матрица се отбелязва с главна латинска буква – например A. За означаване елементи на матрица
се ползват малка или главна буква - aij или Aij, като първият индекс показва номера на реда,
а вторият - номера на стълба / колоната, на която се намира елементът в тази матрица.
Две матрици са равни, когато техните елементи са от един и същи тип и съответните елементи
(по ред, колона) са равни. При работа с матрица в програмирането се ползва двумерен масив
(редове и колони), който се обхожда най-често с два вложени for цикъла.
квадратна матрица - броят редове е равен на броя колони
симетрична матрица - квадратна матрица, чиито елементи симетрично разположени относно главния диагонал са равни
триъгълна матрица - квадратна матрица, при която всички елементи под или над главния диагонал са нули е, съответно горна или долна триъгълна матрица;
диагонална матрица - квадратна матрица, чийто ненулеви елементи са само в главния диагонал;
скаларна матрица - диагонална матрица, всички елементи от главния диагонал са равни
единична матрица - скаларна матрица с елементи от главния диагонал равни на единица
симетрична матрица
Една квадратна матрица е симетрична матрица, ако съвпада с транспонираната си, т.е.
ако е е изпълнено равенството aij = aji (i<>j).
Разглеждаме равенство за всяка двойка елементи, разположени на симетрични позиции
спрямо основния диагонал на квадратна матрица.
Произведението на правоъгълна матрица с транспонираната си също дава симетрична матрица.
Да разгледаме следната примерна задача:
Имаме квадратна матрица - с равен брой редове и колони n.
Всички елементи в тази матрица са естествени - цели, едноцифрени числа.
При генерирането на стойности за елементи трябва да се подбират такива числа,
че тази матрица да е симетрична спрямо основния си диагонал.
Да се изведе съдържанието на симетричната матрица по редове и колони.
Да се извърши умножение на генерираната вече симетрична матрица с цяло число.
Алгоритъм за умножение на матрица с число
Всеки елемент от началната матрица се замества с произведението от число и съответния елемент на същата матрица.
Най-често обхождането на матрицата се извършва с два вложени цикъла - по редове и колони.
Приложената примерна програма дава решена задача за умножение на матрица с число:
#include <iostream>
#include <stdlib.h>
using namespace std;
int const red=6;//broj redowe, koloni
int const mnovitel=-1;
void Minus (int mas[][red])
{ int i,j;
for (i=0;i<red;i++)
{ for (j=0;j<red;j++) mas[i][j]*=mnovitel;
}//for i
}//umnovawane na matrica s chislo
void Triyg(int mas[][red])
{ int i,j;
for (i=0;i<red;i++)
{ for (j=0;j<red;j++)
{if (j<i) mas[i][j]=mas[j][i]; else mas[i][j] =rand()%10;
}//for j
}//for i
}//triygylna matrica
void Pechat(int mas[][red])
{int i,j;
for (i=0;i<red;i++)
{ for (j=0;j<red;j++) {cout<<mas[i][j]<<" ";}
cout<<endl;
}//for i
}//Pechat matrica
int main()
{int mas[red][red];
cout<<"Da se systawi programa, chrez koqto se generira simetrichna \n";
cout<<"matrica. Tazi matricata da byde s razmeri [5][5] i da sydyrva celi\n";
cout<<"chisla ot interwala [0..9]. Da se izwede sydyrvanieto na matricata.\n";
cout<<"Da se predstawi proziwedenieto na tazi matrica s -1.\n";
cout<<"simetricna matrica:\n";
Triyg( mas);
Pechat(mas);
cout<<"Rezultat, sled umnovenie po -1:\n";
Minus (mas);
Pechat(mas);
system("pause");
return 0;
}//kraj na programa matrica
Начало на страницата
триъгълна матрица
Казваме, че една квадратна матрица е
триъгълна матрица, ако всички елементи под или над главният диагонал са нули.
За подобна матрица казваме съответно, че е горно диагонална или долно диагонална триъгълна матрица:
Тук ще разгледаме триъгълна матрица, при която всички елементи, стоящи под главния диагонал, имат стойност нула.
Имаме въведени случайни естествени числа от интервала [10..100] в квадратна матрица с размери 7*7.
Числата - елементите в тази матрица, не са непременно различни.
От тази матрица да се състави триъгълна матрица по следния алгоритъм:
а) всички елементи под основния диагонал да станат равни на нула,
като тяхната стойност се прибави към огледално разположените елементи над главния диагонал;
б) всички елементи по главния диагонал запазват стойността си.
Предварително се генерират всички числа - елементи в тази матрица
като се използва цикъл от 0 до общия брой елементи - void chisla.
Извежда се началния вид на тази матрица с два вложени цикъла - void pechat.
Сумират се стойностите на всички елементи лежащи от двете страни на основния диагонал - void triyg.
Извежда се окончателния вид - новата матрица чрез void pechat.
Следващата примерна програма дава решение на задачата за формиране на триъгълна матрица:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
using namespace std;
int const kol=7,red=7;
void pechat (int mas[][kol])//izwevda stojnosti na elementi
{int i,j;
for (i=0; i<red; i++)
{ for (j=0; j<kol; j++)
{cout<<setw(3)<<mas[i][j]<<"; ";}//for j
cout<<endl;
}//for i
}//izwevda matrica
void triyg (int mas[][kol])//preobrazuwa kwadratna matrica w triygylna
{ int i,j;
for (i=0; i<red; i++)
{ for (j=i+1; j<kol; j++)
{mas[i][j]+=mas[j][i];
//pribawq stojnostta na elementa kym ogledalniq mu otnosno glawniq diagonal
mas[j][i]=0;}//nulira stojnostta na elementa pod glawniq diagonal
} //for i
}// kwadratnata matrica w triygylna
void chisla (int mas[][kol])//generira sluchajni chisla
{int i,br,c,r,chis;
br=kol*red;//edinichen cikyl do razmera na proizwedenieto redowe*koloni
for (i=0; i<br; i++)
{ r=i/kol;//indeks po redowe
c=i%kol;//indeks po koloni
chis=10+rand () %90;//sluchajno chislo ot interwala [10..99] element w matrica
mas[r][c]=chis;
}//for
}//broj elementi w matrica
int main()
{ int i;
int mas[red][kol];
time_t t;
char ose;
srand((unsigned) time(&t));//inicializira generator na suchajni chisla
cout<<"Pri wsqko startirane na programata da se izwevdat razlichni\n";
cout<<"po stojnost i naredba, estestweni chisla ot interwala [10..99].\n";
cout<<"Programata she izwede sydyrvanieto na kwadratna matrica, she q\n";
cout<<"preobrazuwa w triygylna - wsichki elementi pod osnowniq diagonal\n";
cout<<"she stanat 0, a tqhnata stojnost she se pribawi kym syotweniq im\n";
cout<<"element nad glawniq diagonal.\n";
cout<<"She generiram sluchajni chisla ot interwala [10..99]\n";
do {
chisla (mas);//zapylwane sys sluchajni chisla
pechat (mas);//izwevdane sydyrvanie na matrica
cout<<"Zapazwat se samo elementi levashi na osnowniq diagonal:\n";
triyg (mas);//prehwyrlq stojnostta na elementi pod glawniq diagonal
pechat (mas);
cout<<"Velaete li da generiram nowa sywkupnost ot chisla <y/n>: ";cin>>ose;
}while (ose=='y');
system("pause");//
return 0; //
} //kraj na programa matrica
Начало на страницата
диагонална матрица
Казваме, че една квадратна матрица е
диагонална матрица, ако всички нейни елементи освен тези в главния диагонал са нули.
Да припомним: една матрица е квадратна (от ред n), когато има равен брой редове и стълбове (n на брой).
В квадратна матрица от ред n, на главния диагонал принадлежат елементи с равни индекси за ред и колона (aii, i=1.. n).
В квадратна матрица от ред n, страничен диагонал е образуван от елементи със сума от индекси n+1 (aij, i=1.. n, j=n..1),
Да разгледаме следната примерна задача:
Имаме предварително въведена квадратна матрица, чийто елементи са естествени числа.
Обикновено се ползват два вложени цикъла за генериране на случайни елементи за разглежданата матрица
или за извеждане - в приложения пример се ползва само един цикъл.
Алгоритъмът се базира на факта, че общия брой елементи във всяка матрица може да се представи
като произведение на брой редове * брой стълбове.
Тази квадратна матрица трябва да се преобразува в диагонална матрица като стойността на
всички елементи над главния диагонал се прибавят към съответния елемент от същия стълб на главния диагонал;
всички елементи под главния диагонал се изваждат от съответния елемент от същия стълб на главния диагонал;
Програмата извежда крайното състояние на формираната диагонална матрица.
Следващата примерна програма съдържа решена задача за диагонална матрица:
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
using namespace std;
int const kol=7,red=7;
void pechat (int mas[][kol])//stojnosti na elementi w natrica
{int i,j;
for (i=0; i<red; i++)
{ for (j=0; j<kol; j++)
{cout<<setw(3)<<mas[i][j]<<"; ";}//for j
cout<<endl;
}//for i
}//elementi w natrica
//pod osnowniq diagonal
void triyg_pod (int mas[][kol])// kwadratna matrica w triygylna
{ int i,j;
for (i=0; i<red; i++)
{ for (j=i+1; j<kol; j++)
{mas[i][i]+=mas[j][i];
//pribawq stojnostta na elementa kym ogledalniq mu otnosno glawniq diagonal
mas[j][i]=0;}//nulira stojnostta na elementa pod glawniq diagonal
} //for i
}// kwadratna matrica w triygylna
//nad osnowniq diagonal
void triyg_nad (int mas[][kol])//preobrazuwa kwadratnata matrica w triygylna
{ int i,j;
for (i=0; i<kol; i++)
{ for (j=i+1; j<red; j++)
{mas[j][j]+=mas[i][j];
//pribawq stojnostta na elementa kym ogledalniq mu otnosno glawniq diagonal
mas[i][j]=0;}//nulira stojnostta na elementa pod glawniq diagonal
} //for i
}// kwadratnata matrica w triygylna
void chisla (int mas[][kol])//generira sluchajni chisla
{int i,br,c,r,chis;
br=kol*red;// proizwedenie redowe * koloni na matrica
for (i=0; i<br; i++)
{ r=i/kol;// po redowe
c=i%kol;// po koloni
chis=10+rand () %90;//sluchajno chislo ot interwala [10..99] za element na matrica
mas[r][c]=chis;
}//for redowe * koloni
}//elementi w matrica
int main()
{ int i;
int mas[red][kol];
time_t t;
char ose;
srand((unsigned) time(&t));//inicializira generator na suchajni chisla
cout<<"Pri wsqko startirane na programata da se izwevdat razlichni\n";
cout<<"po stojnost i naredba, estestweni chisla ot interwala [10..99].\n";
cout<<"Programata she izwede sydyrvanieto na kwadratna matrica, she q\n";
cout<<"preobrazuwa w diagonalna - wsichki elementi pod i nad osnowniq \n";
cout<<"diagonal she stanat 0, a tqhnata stojnost she se pribawi \n";
cout<<"kym syotweniq im element w syshata kolona na glawniq diagonal.\n";
cout<<"She generiram sluchajni chisla ot interwala [10..99]\n";
do {
chisla (mas);//zapylwane na matrica sys sluchajni chisla
pechat (mas);//izwevdane matrica
cout<<"Uwelichawa se stojnostta na elementi levashi na osnowniq diagonal:\n";
triyg_pod (mas);//prehwyrlq stojnostta na elementi pod glawniq diagonal
pechat (mas);//izwevdane matrica
cout<<"Uwelichawa se stojnostta na elementite levashi na osnowniq diagonal:\n";
triyg_nad (mas);//prehwyrlq stojnostta na elementi nad glawniq diagonal
pechat (mas);//izwevdane matrica
cout<<"Velaete li da generiram nowa matrica <y/n>: ";cin>>ose;
}while (ose=='y');
system("pause");
return 0;
} //kraj na programa za matrica
Начало на страницата
адюнгирано количество
Някои от известните методи за изчисляване на системи уравнения са:
метод Гаус - с елиминиране на променливите; чрез формулите на Крамер; симплекс метод и др.
Минор Aij на дадена матрица се получава като от началната матрица се премахват всички нейни елементи от ред i и стълб j.
Стойността на дадена матрица може да се изчисли посредством сумата от адюнгираните количества по даден ред или стълб.
Адюнгирано количество Aij на дадена матрица за конкретен елемент има стойността на произведението от:
а) първи множител (-1) на степен сумата ( i+j ), където j е индекс на реда, а j индекс на колоната.
б) втори множител - матрица, получена като резултат след премахване на елементите от ред i и стълб j от началната матрица, т.е. в новата матрица участват всички елементи от началната матрица без елементите, принадлежащи на указания ред и стълб.
Примерна задача за
адюнгирано количество на матрица:
Имаме предварително запълнена правоъгълна матрица с брой редове и брой колони k,r естествени числа от интервала [3..15].
Елементите на началната матрица са случайни двуцифрени числа - естествени числа от интервала [10..99].
Да се състави програма, чрез която по въведени 2 естествени числа А1,А2, представляващи индексите на елемент от матрица,
се изведат: елементите на разглежданата матрица, както и адюнгирано количество по указания елемент - с въведените индекси.
Следващата примерна програма дава решена задача за извеждане адюнгирано количество на матрица:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int red=6,kol=6,obh=100;//broj redowe, koloni, maksimalen razmer
int sluch()
{//generira sluchajni chisla ot interwala [10..99]
int a=1;
while(a<10 || a>=obh) a=rand()%(obh);
return a;
}//elementi w matrica
void zapulwa(int mas1[][kol])
{int i,j;
for( i=0;i<red;i++)
{
for( j=0;j<kol;j++) { mas1[i][j]=sluch(); }
}//for i
}//zapylwa elementi w matrica
void pechat(int mas1[][kol], int r, int k)
{int i,j;
for( i=0;i<r;i++)
{ for(j=0;j<k;j++) {cout<<mas1[i][j]<<" ";}
cout<<endl;
}//for i
}//pechat elementi na matrica
void getAdj(int mas1[][kol],int mas2[][kol], int &r1,int &k1)
{
int r2,k2,i,j,koef;
cout<<endl;
cout<<"Naj-malkiqt nomer na red i kolona e 1.\n";
cout<<"Wywedete indeks za red: ";cin>>r1;
cout<<"Wywedete indeks za kolona: ";cin>>k1;
cout<<endl;
r2=k2=0;
//ot tazi matrica se premahwat celiq red i stylb, kym koito prinadlevi
//ukazaniq element - indeksi r1,k1
cout<<"Premahwam red "<<r1<<" i kolona "<<k1<<endl;
if ((r1+k1)%2) koef=-1; else koef=1;
cout<<"Mnovitel "<<koef*mas1[r1-1][k1-1]<<endl;
r1--;k1--;//nachalniq red i kolona w masiwa matrica e 0
for( i=0;i<red;i++)//po redowe
{ if (i==r1) {cout<<"-- "<<endl;continue;}//prekyswa tekushiq red
k2=0;//winagi zapochwa ot 1-wata kolona
for( j=0;j<kol;j++) //po koloni
{ if(j==k1) {cout<<"__ ";continue;}//prekyswa za tekushata kolona
mas2[r2][k2]=mas1[i][j];//formira adiungiranoto kolichestwo w matrica
cout<<mas1[i][j]<<" ";
k2++;//sledwasha kolona
}//for j
cout<<endl;
r2++;//sledwash red
}//for i
cout<<endl;
}//getAdj adiungirano kolichestwo na matrica
int main()
{ int r1,k1;
int mas1[red][kol],mas2[red][kol];
char ose;
r1=k1=0;
time_t t;//polzwa tekushoto wreme
srand((unsigned) time(&t));//inicializira generator na suchajni chisla
cout<<"Imate predwaritelno zapylnena prawoygylna matrica s broj redowe i\n";
cout<<"i koloni k,r estestweni chisla ot interwala [3..15]. Elementite na\n";
cout<<"na matricata sa sluchajni estestweni chisla ot interwala [10..99].\n";
cout<<"Da se systawi programa, chrez koqto po wywedeni 2 estestweni chisla\n";
cout<<"A1,A2, predstawlqwashi indeksite na element ot matricata, se izwevdat\n";
cout<<"elementite na tazi matrica, kakto i adiungiranoto kolichestwo po\n";
cout<<"ukazaniq element - s wywedenite indeksi.\n";
do {
zapulwa(mas1);
pechat(mas1,red,kol);
cout<<endl;
getAdj(mas1,mas2,r1,k1);//premahwa ukazaniq red i kolona
cout<<"Formiranoto adiungirano kolichestwo za elementa "<<mas1[r1][k1]<<" e:"<<endl;
pechat(mas2,red-1,kol-1);//1 red i 1 kolona po-malko
cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
} while (ose=='y');
system("pause");//
return 0;//
}//kraj na programa adiungiranoto kolichestwo na matrica
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.
Начало на страницата