Матрица - квадратна, триъгълна, диагонална, адюнгирано количество

Съдържание

симетрична матрица
триъгълна матрица
диагонална матрица
адюнгирано количество
събиране на матрици
умножение на матрици
транспониране на матрица

В математиката, матрица представлява правоъгълна таблица от елементи, най-често числа (числова матрица). Матрица от тип 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

Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.

Начало на страницата

 
Размер на шрифта
Increase Font Size Option 3 Reset Font Size Option 3 Decrease Font Size Option 3
Bulgarian Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Търсене в сайта: