MACIERZE Sobiesiak Łukasz Wilczyńska Małgorzata
Podstawowe pojęcia dotyczące macierzy Nie bez przyczyny zaczynamy od pojęcia macierzy, które jest niezwykle przydatne we wszystkich zastosowaniach, obliczeniach i zapisach. Już przy rozwiązywaniu układu równań posługujemy się głównie operacjami elementarnymi na macierzy dołączonej takiego układu, a z zapisu macierzowego różnego typu przekształceń liniowych możemy odczytać wiele ich własności.
Często też określonemu typowi przekształcenia liniowego odpowiada określony typ macierzy i odwrotnie. Przyjmujemy tu najprostszą definicję macierzy jako tablicy złożonej z liczb, choć można podać jej bardziej poprawną matematyczną definicję, np. jako funkcji określonej na pewnym zbiorze par(i,j) liczb naturalnych.
Liczby zawarte w macierzy będziemy nazywali elementami. Elementy macierzy ułożone są w poziome wiersze i w pionowe kolumny Rozmiar macierzy określony jest przez liczbę wierszy i kolumn. Zatem zapis: A m n
Niech m i n będą ustalonymi liczbami naturalnymi. Macierzą (złożoną z m wierszy i n kolumn) nazywamy prostokątną tablicę postaci:
Ilość wierszy i kolumn, tj. parę liczb(m,n) nazywamy wymiarem tej macierzy. Np.. Macierz Ma trzy wiersze i cztery kolumny, przy czym a 11 =3, a 23 =7 itd. Elementy macierzy numerowane są dwoma wskaźnikami, np. dla elementu a 24 =6(czytamy a dwa cztery) wskaźnik 2 oznacza numer wiersza, a wskaźnik 4 numer kolumny. Liczba 6 znajduje się na przecięciu się drugiego wiersza i czwartej kolumny.
Przykład: Program, który po wypisaniu każdego elementu macierzy, tworzy macierz.
#include <iostream> using namespace std; int main() int tablica[4][3]; cout << "Podaj elementy tablicy: " << endl; for(int i = 0; i < 4; i++) for(int j = 0; j < 3; j++) cout << "Element["<< i <<"]["<<j<<"]: "; cin >> tablica[i][j]; cout << "\nwprowadzone elementy tablicy to: " << endl; for(int i = 0; i < 4; i++) for(int j = 0; j < 3; j++) cout <<tablica[i][j]<<" "; cout << endl; return 0;
Przekątną główną macierzy tworzą elementy o równych indeksach wierszowych i kolumnowych, np:
Macierz nazywamy wektorem wierszowym jeśli składa się tylko z jednego wiersza, np. A 1 4 = a 1 a 2 a 3 a 4 Macierz nazywamy wektorem kolumnowym,jeśli składa się tylko z jednej kolumny, np: A 3 1 =
Macierz nazywamy kwadratową jeśli posiada tyle samo wierszy co kolumn, np: A 3 3 =
Stopień macierzy kwadratowej określa liczba jej wierszy lub kolumn. Powyższa macierz jest stopnia 4. Macierz nie będąca macierzą kwadratową jest macierzą prostokątną. Macierz nazywamy diagonalną,jeśli jest macierzą kwadratową i wszystkie elementy jej głównej przekątnej są niezerowe, a pozostałe elementy mają wartość równą zero.
Macierz nazywamy jednostkową i oznaczamy literą I, jeśli jest macierzą diagonalną, a wszystkie niezerowe elementy są równe 1.
Macierz nazywamy trójkątną, jeśli jest macierzą kwadratową i elementy zerowe znajdują się tylko ponad główną przekątną (macierz trójkątna dolna L) lub tylko pod główną przekątną (macierz trójkątna górna U)
Macierze mogą być reprezentowane w pamięci komputera przez tablice dwuwymiarowe. Rozwiązanie to przydaje się w przypadku, gdy z góry znany jest rozmiar macierzy.
Deklarację tablicy w języku Pascal umieszczamy w sekcji deklaracji zmiennych var. Składnia deklaracji tablicy dwuwymiarowej jest następująca:
Słowa array oraz of są słowami kluczowymi, które muszą się pojawić w deklaracji tablicy. Poniżej podajemy kilka przykładów:
http://forum.pclab.pl/topic/830877-mnozeniedwoch-macierzy-w-c/
#include <iostream> using namespace std; void p(int m, int n, int ** A) int i,j; for(i = 0; i < m; i++) for(j = 0; j < n; j++) A[i][j] = (i + j) % 2; Program,który tworzy macierz [0,1] for(i = 0; i < m; i++) for(j = 0; j < n; j++) cout << A[i][j] << " "; cout << endl; int main() int ** A,n,m,i; cout << "m = "; cin >> m; cout << "n = "; cin >> n; A = new int * [m]; for(i = 0; i < m; i++) A[i] = new int [n]; p(m,n,a); for(i = 0; i < m; i++) delete [] A[i]; delete [] A; return 0;
Pomnożyć macierz A m n przez skalar c. Mnożenie macierzy przez skalar polega na pomnożeniu każdego elementu macierzy przez dany skalar. Mnożąc macierz o wymiarze m n przez stałą k lub przez liczbę, otrzymujemy macierz, która ma również wymiar m n. Jeżeli element w i-tym wierszu i j-tej kolumnie ma postać a ij, to odpowiednim elementem iloczynu jest ka ij.
Działanie to jest rozdzielne względem dodawania i odejmowania macierzy. Zatem dla dwóch macierzy A i B zachodzi: k(a + B) = ka + kb oraz ka = Ak
#include <iostream> #include <iomanip> #include <cstdlib> #include <time.h> using namespace std; int main() int ** A,c,n,m,iw,ik; srand((unsigned)time(null)); m = rand() % 8 + 2; n = rand() % 8 + 2; A = new int * [m]; for(iw = 0; iw < m; iw++) A[iw] = new int[n]; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) A[iw][ik] = rand() % 100; c = rand() % 21-10; cout << "m = " << m << endl << "n = " << n << endl << endl; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) cout << setw(5) << A[iw][ik]; cout << endl; cout << endl << "c = " << c << endl << endl; Program generuje macierz o losowej liczbie wierszy (od 2 do 9) i losowej liczbie kolumn (od 2 do 9) oraz losowy skalar z zakresu od -10 do 10. Macierz zostaje wypełniona losowymi liczbami (od 0 do 99). for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) A[iw][ik] *= c; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) cout << setw(5) << A[iw][ik]; cout << endl; for(iw = 0; iw < m; iw++) delete [] A[iw]; delete [] A; return 0;
Dodać macierz B m n do macierzy A m n i wynik umieścić w macierzy C m n. Operacja dodawania dwóch macierzy polega na dodawaniu ich elementów leżących w tych samych wierszach i kolumnach. Wynika z tego oczywisty wniosek, iż dodawane macierze muszą posiadać takie same wymiary.
Z określenia tego bezpośrednio wynika, że własności dodawania macierzy są takie same, jak własności struktury, nad którą macierz jest zbudowana - jeżeli dodawanie składowych jest łączne, to łączne jest również dodawanie macierzy itd. W analogiczny sposób odejmujemy macierze.
Przykład:
Program, który oblicza sumę macierzy
#include<iostream> using namespace std; void wprowadz_macierz(int macierz[][10],int wiersze, int kolumny); void dodaj_macierze(int macierza[][10], int macierzb[][10], int macierzc[][10],int wiersze, int kolumny); void wyswietl_wynik(int macierzc[][10],int wiersze,int kolumny); int main() int maca[10][10], macb[10][10], macc[10][10]=0,wmac,kmac; cout << "Podaj rozmiar obu macierzy:\nwierszy: "; cin >> wmac; cout << "Kolumn: "; cin >> kmac; if((kmac) && (wmac) && (wmac<11) && (kmac<11)) cout << "\nmacierz A: \n"; wprowadz_macierz(maca,wmac,kmac); cout << "\nmacierz B\n"; wprowadz_macierz(macb,wmac,kmac); dodaj_macierze(maca,macb,macc,wmac,kmac); wyswietl_wynik(macc,wmac,kmac); else cout << "Zly rozmiar macierzy!\n"; return 0; void wprowadz_macierz(int macierz[][10], int wiersze, int kolumny) for(int i=0; i<wiersze; i++) for(int j=0; j<kolumny; j++) cout << "Podaj element (" << i+1 << "," << j+1 << "): "; cin >> macierz[i][j]; void dodaj_macierze(int macierza[][10], int macierzb[][10], int macierzc[][10],int wiersze,int kolumny) for(int i=0; i<wiersze; i++) for(int j=0; j<kolumny; j++) macierzc[i][j]=macierza[i][j]+macierzb[i][j]; void wyswietl_wynik(int macierzc[][10],int wiersze,int kolumny) cout << "\nwynik:\n"; for(int i=0; i<wiersze; i++) for(int j=0; j<kolumny; j++) cout << macierzc[i][j]; if(j<kolumny-1) cout << ", "; cout << "\n"; cout << "\n";
Program generuje trzy macierze o losowej lecz równej liczbie wierszy (od 2 do 5) i losowej lecz równej liczbie kolumn (od 2 do 5). Dwie pierwsze macierze zostają wypełnione losowymi wartościami od 0 do 99 i wyświetlone. Następnie program oblicza w trzeciej macierzy ich sumę i wyświetla wynik.
#include <iostream> #include <iomanip> #include <cstdlib> #include <time.h> using namespace std; int main() int **A,**B,**C,n,m,iw,ik; srand((unsigned)time(null)); m = rand() % 5 + 2; n = rand() % 5 + 2; A = new int * [m]; B = new int * [m]; C = new int * [m]; for(iw = 0; iw < m; iw++) A[iw] = new int[n]; B[iw] = new int[n]; C[iw] = new int[n]; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) A[iw][ik] = rand() % 100; B[iw][ik] = rand() % 100; cout << "m = " << m << endl << "n = " << n << endl << endl << "Matrix A:" << endl; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) cout << setw(5) << A[iw][ik]; cout << endl; cout << endl << "Matrix B:" << endl; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) cout << setw(5) << B[iw][ik]; cout << endl; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) C[iw][ik] = A[iw][ik] + B[iw][ik]; cout << endl << "Matrix C = A + B:" << endl; for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) cout << setw(5) << C[iw][ik]; cout << endl; for(iw = 0; iw < m; iw++) delete [] A[iw]; delete [] B[iw]; delete [] C[iw]; delete [] A; delete [] B; delete [] C; return 0;
KONIEC