Transponowanie macierzy Mnożenie macierzy Potęgowanie macierzy Wyznacznik macierzy
|
|
- Emilia Rosińska
- 4 lat temu
- Przeglądów:
Transkrypt
1
2 Transponowanie macierzy Mnożenie macierzy Potęgowanie macierzy Wyznacznik macierzy
3 Problem Transponować macierz A m n na A T n m. Operacja transponowania macierzy polega na zamianie wierszy w kolumny i kolumn w wiersze. Operację transponowania oznaczamy literką T. Ponieważ kolumny i wiersze wymieniają się wzajemnie, macierz transponowana posiada n wierszy i m kolumn. Przykład: =
4 Wejście m liczba wierszy macierzy, m N n liczba kolumn macierzy, n N A macierz do transponowania o m wierszach i n kolumnach, A R B macierz wynikowa o n wierszach i m kolumnach, B R Wyjście: Macierz B = A T Elementy pomocnicze: i w indeks wierszowy macierzy, i w N i k indeks kolumnowy macierzy, i k N Lista kroków: K01: Dla i w = 1,2,...,m wykonuj K02...K03 K02: Dla i k = 1,2,...,n wykonuj K03 K03: B[i k,i w ] A[i w,i k ] K04: Zakończ
5 Program generuje losowe liczby m i n (od 2 do 8). Następnie tworzy macierz A m n oraz macierz B n m. Macierz A jest wypełniana losowymi liczbami z zakresu od -99 do 99, wyświetlana i transponowana w macierzy B. Na koniec program wyświetla zawartość macierzy B.
6 #include <iostream> #include <iomanip> #include <cstdlib> #include <time.h> using namespace std; int main() int **A,**B,n,m,iw,ik; srand((unsigned)time(null)); // losujemy wymiary macierzy m = rand() % 7 + 2; n = rand() % 7 + 2; // tworzymy tablicę wskaźników A = new int * [m]; B = new int * [n]; // tworzymy tablice wierszy for(iw = 0; iw < m; iw++) A[iw] = new int[n]; for(iw = 0; iw < n; iw++) B[iw] = new int[m]; // wypełniamy macierz A losowymi liczbami for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) A[iw][ik] = rand() % ; // wyświetlamy macierz A 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; // transponujemy macierz A w B for(iw = 0; iw < m; iw++) for(ik = 0; ik < n; ik++) B[ik][iw] = A[iw][ik]; // wyświetlamy macierz wynikową cout << endl << "Matrix B = AT:" << endl; for(iw = 0; iw < n; iw++) for(ik = 0; ik < m; ik++) cout << setw(5) << B[iw][ik]; cout << endl; // koniec, zwalniamy pamięć zajętą przez macierze for(iw = 0; iw < m; iw++) delete [] A[iw]; for(iw = 0; iw < n; iw++) delete [] B[iw]; delete [] A; delete [] B; return 0;
7 Problem: Transponować macierz kwadratową A n n w miejscu. Podany powyżej algorytm transponowania macierzy wymaga dodatkowej pamięci. Jeśli macierz jest kwadratowa, to możemy transponować ją w miejscu. zamieniając miejscami elementy kolumn i wierszy. Zasada jest następująca: Załóżmy, iż mamy transponować poniższą macierz stopnia 4:
8 Zwróć uwagę, iż dla macierzy kwadratowej główna przekątna pozostaje bez zmian po transponowaniu. Elementy leżące na głównej przekątnej nie musimy przemieszczać. W pierwszym kroku wymienimy zatem elementy pierwszej kolumny i pierwszego wiersza z pominięciem elementu 1, który leży właśnie na głównej przekątnej:
9 Po wykonaniu tej operacji pierwsza kolumna i pierwszy wiersz macierzy są gotowe. Nie będziemy ich już zmieniać. W drugim kroku wykonujemy identyczną operację, lecz na pozostałej części macierzy, tzn. z pominięciem pierwszego wiersza i pierwszej kolumny:
10 W efekcie dwa pierwsze wiersze i dwie pierwsze kolumny macierzy są gotowe. Operację kontynuujemy z pozostałą częścią macierzy: Operacja jest zakończona, ponieważ pozostała część macierzy jest już macierzą jednoelementową (zawiera tylko element 16), a transpozycja macierzy jednoelementowej jest tożsamościowa.
11 Wejście n stopień macierzy, n N A kwadratowa macierz do transponowania stopnia n, A R Wyjście: Macierz A = AT Elementy pomocnicze: i,j indeksy, i,j N t tymczasowe miejsce przechowywania elementu macierzy, t R Lista kroków: K01: Dla i = 1,2,...,n - 1 wykonuj K02...K05 K02: Dla j = i + 1,i + 2,...,n wykonuj K03...K05 K03: t A[i,j] K04: A[i,j] A[j,i] K05: A[j,i] t K06: Zakończ
12 Program generuje losowy stopień macierzy n (od 2 do 8). Następnie tworzy macierz kwadratową A n n, którą wypełnia losowymi liczbami z zakresu od -99 do 99. Macierz A zostaje wyświetlona i transponowana. Na koniec program wyświetla ponownie zawartość macierzy A.
13 #include <iostream> #include <iomanip> #include <cstdlib> #include <time.h> using namespace std; main() int **A,n,i,j,t; srand((unsigned)time(null)); // losujemy stopień macierzy n = rand() % 7 + 2; // tworzymy tablicę wskaźników A = new int * [n]; // tworzymy tablice wierszy A[i] = new int[n]; // wypełniamy macierz A losowymi liczbami for(j = 0; j < n; j++) A[i][j] = rand() % ; cout << "n = " << n << endl << endl << "Matrix A:" << endl; for(j = 0; j < n; j++) cout << setw(5) << A[i][j]; cout << endl; // transponujemy macierz A for(i = 0; i < n - 1; i++) for(j = i + 1; j < n; j++) t = A[i][j]; A[i][j] = A[j][i]; A[j][i] = t; // wyświetlamy macierz A cout << endl << "Matrix AT:" << endl; for(j = 0; j < n; j++) cout << setw(5) << A[i][j]; cout << endl; // koniec, zwalniamy pamięć zajętą przez macierz delete [] A[i]; delete [] A; // wyświetlamy macierz A
14 Problem: Znaleźć wynik mnożenia macierzy A m n przez macierz B n p. Aby zrozumieć zasadę mnożenia dwóch macierzy, zastosujemy prosty schemat postępowania. Załóżmy, iż mamy macierz A 3 4 i B 4 5 o następującej zawartości: A 3 x 4 = A 4 x5 =
15 Wynikiem mnożenia dwóch macierzy jest nowa macierz, która posiada tyle wierszy, ile wierszy miała macierz A oraz tyle kolumn, ile kolumn miała macierz B. W naszym przypadku macierz ta będzie posiadała rozmiar 3 5, ponieważ macierz A posiada 3 wiersze, a macierz B posiada 5 kolumn. Zatem: A m n B n p = C m p Oznaczmy tę macierz jako C 3 5. Po lewej stronie macierzy C umieszczamy macierz A, natomiast macierz B umieszczamy ponad macierzą C. Obliczamy element c 1,1 jako sumę iloczynów kolejnych elementów wiersza 1 macierzy A przez elementy kolumny 1 macierzy B: ?????????????? c 1,1 = (1 4) + (2 3) + (3 8) + (4 5) = = 54
16 Wynika z tego fakt, iż macierz A musi posiadać w wierszu tyle samo elementów, co macierz B w kolumnie. Zatem rozmiary tych macierzy nie mogą być dowolne, lecz muszą spełniać prosty warunek: A m n, B n p Podobnie obliczamy element c 1,2 jako sumę iloczynów kolejnych elementów wiersza 1 macierzy A przez elementy kolumny 2 macierzy B: ????????????? c 1,2 = (1 3) + (2 4) + (3 9) + (4 4) = = 54
17 Operację tę kontynuujemy aż do wyliczenia wszystkich elementów w wierszu 1 macierzy C: ?????????? c 1,3 = (1 2) + (2 5) + (3 8) + (4 3) = = 48 c 1,4 = (1 1) + (2 6) + (3 7) + (4 2) = = 42 c 1,5 = (1 2) + (2 7) + (3 6) + (4 1) = = 38
18 Po wyliczeniu wiersza 1 macierzy C rozpoczynamy obliczanie elementów wiersza 2. Działania wykonujemy wg tego samego schematu sumujemy iloczyny kolejnych elementów wiersza macierzy A przez kolejne elementy kolumny macierzy B ????? c 2,1 = (5 4) + (6 3) + (7 8) + (8 5) = = 134 c 2,2 = (5 3) + (6 4) + (7 9) + (8 4) = = 134 c 2,3 = (5 2) + (6 5) + (7 8) + (8 3) = = 120 c 2,4 = (5 1) + (6 6) + (7 7) + (8 2) = = 106 c 2,5 = (5 2) + (6 7) + (7 6) + (8 1) = = 102
19 Na koniec wyliczamy ostatni wiersz macierzy C według tego samego schematu postępowania: c 3,1 = (9 4) + (8 3) + (7 8) + (6 5) = = 146 c 3,2 = (9 3) + (8 4) + (7 9) + (6 4) = = 146 c 3,3 = (9 2) + (8 5) + (7 8) + (6 3) = = 132 c 3,4 = (9 1) + (8 6) + (7 7) + (6 2) = = 118 c 3,5 = (9 2) + (8 7) + (7 6) + (6 1) = = 122
20 Rachunek skończony. Możemy zapisać: Χ =
21 Wejście m,n,p rozmiary macierzy, m,n,p N A macierz o rozmiarze m n, A R B macierz o rozmiarze n p, B R C macierz o rozmiarze m p, C R Wyjście: Macierz C = A B Elementy pomocnicze: i,j,k indeksy elementów macierzy, i,j,k N s suma częściowa, s R Lista kroków: K01: Dla i = 1,2,...,m wykonuj K02...K06 K02: Dla j = 1,2,...,p wykonuj K03...K06 K03: s 0 ; zerujemy sumę częściową K04: Dla k = 1,2,...,n wykonuj K05 ; obliczamy sumę iloczynów K05: s s + A[i,k] B[k,j] K06: C[i,j] s ; sumę umieszczamy w elemencie macierzy wynikowej K07: Zakończ
22 // Mnożenie macierzy // Data: // (C)2012 mgr Jerzy Wałaszek // #include <iostream> #include <iomanip> using namespace std; int main() int **A,**B,**C,m,n,p,i,j,k,s; // odczytujemy wymiary macierzy cin >> m >> n >> p; // tworzymy macierze o odpowiednich rozmiarach A = new int * [m]; B = new int * [n]; C = new int * [m]; for(i = 0; i < m; i++) A[i] = new int[n]; C[i] = new int[p]; B[i] = new int[p]; // odczytujemy dane dla macierzy A for(i = 0; i < m; i++) for(j = 0; j < n; j ++) cin >> A[i][j]; // odczytujemy dane dla macierzy B for(j = 0; j < p; j++) cin >> B[i][j]; cout << endl; // mnożymy macierz A przez B i wynik umieszczamy w C for(i = 0; i < m; i++) for(j = 0; j < p; j++) s = 0; for(k = 0; k < n; k++) s += A[i][k] * B[k][j]; C[i][j] = s; // wyprowadzamy wynik mnożenia w C cout << "C = A x B:\n"; for(i = 0; i < m; i++) for(j = 0; j < p; j++) cout << setw(6) << C[i][j]; cout << endl; // zwalniamy pamięć zajętą przez macierze for(i = 0; i < m; i++) delete [] A[i]; delete [] C[i]; delete [] B[i]; delete [] A; delete [] B; delete [] C; return 0;
23 Problem: Obliczyć k-tą potęgę A n n. Rozwiązanie nr 1: Zdefiniujmy następujące operacje: A 0 = I (macierz jednostkowa) A 1 = A A 2 = A A A 3 = A A A A k = A A... A (k - 1 mnożeń) Pierwszy algorytm będzie algorytmem naiwnym, który wykonuje k-1 mnożeń macierzy A.
24 Wejście n stopień macierzy, n N, n > 0 A potęgowana macierz, A R k wykładnik potęgowy, k N, k 0 Wyjście: A zawiera k-tą potęgę wejściowej macierzy A. Elementy pomocnicze: W macierz pomocnicza, przechowuje wyniki częściowe mnożenia, W R P macierz pomocnicza, przechowuje A, P R i do sterowania pętlą, i N Lista kroków: K01: Jeśli k > 0, to idź do K04 K02: Ustaw macierz jednostkową w A ;A0 = I K03: Zakończ K04: Jeśli k = 1, to zakończ ; A1 = A K05: P A ; zapamiętaj oryginalną macierz A K06: Dla i = 2,3,..., k wykonuj K07...K08 K07: W P A ; wykonaj mnożenie K08: A W ; w A wynik mnożenia (i potęgowania) K09: Zakończ
25 // Potęgowanie macierzy // Data: // (C)2012 mgr Jerzy Wałaszek // #include <iostream> #include <iomanip> using namespace std; // procedura mnożenia macierzy // C = A x B // void mnoz(int n, double ** A, double ** B, double ** C) int i,j,k; double s; for(j = 0; j < n; j++) s = 0; for(k = 0; k < n; k++) s += A[i][k] * B[k][j]; C[i][j] = s; // procedura przepisuje macierz A do macierzy B // void przepisz(int n, double ** A, double ** B) int i,j; for(j = 0; j < n; j++) B[i][j] = A[i][j]; // procedura ustawia w macierzy A macierz jednostkową // void jednostkowa(int n, double ** A) int i,j; for(j = 0; j < n; j++) A[i][j] = 0; A[i][i] = 1; // procedura wylicza potęgę k-tą macierzy A // void potega(int k, int n, double ** A) double ** P, ** W; int i; if(!k) jednostkowa(n,a); else if(k > 1) // tworzymy macierze pomocnicze P i W P = new double * [n]; W = new double * [n]; P[i] = new double[n]; W[i] = new double[n]; // macierz A zapamiętujemy w P przepisz(n,a,p); // w pętli wykonujemy kolejne mnożenia - wynik zawsze w A for(i = 2; i <= k; i++) mnoz(n,p,a,w); // W <- P x A przepisz(n,w,a); // A <- P x A // usuwamy macierze P i W delete [] P[i]; delete [] W[i]; delete [] P; delete [] W; //*** PROGRAM GŁÓWNY *** // int main() double ** A; int n,i,j,k; cout << fixed << setprecision(2); // wczytujemy wykładnik k oraz stopień macierzy n cin >> k >> n; // tworzymy macierz dynamiczną i wczytujemy dane wierszami A = new double * [n]; A[i] = new double[n]; for(j = 0; j < n; j++) cin >> A[i][j]; // obliczamy k-tą potęgę A potega(k,n,a); // wyświetlamy wyniki cout << endl; for(j = 0; j < n; j++) cout << setw(10) << A[i][j] << " "; cout << endl; // usuwamy macierz A delete [] A[i]; delete [] A; return 0;
26 Rozwiązanie nr 2: Zauważmy następującą własność mnożenia macierzy: An+m = An Am Dalej: A2 = A A A4 = A2 A2 A8 = A4 A4... Jak widzimy, potęgi o wykładnikach będących potęgami liczby 2 możemy łatwo otrzymywać mnożąc macierz przez siebie. Idea nowego algorytmu potęgowania przedstawię na prostym przykładzie. Załóżmy, iż chcemy obliczyć A13. Zatem k = 13. Możemy zapisać: A13 = A8+4+1 = A8 A4 A Zwróć uwagę, iż mnożymy przez siebie macierze, które są potęgami pierwotnej macierzy A o wykładnikach równych 8, 4 i 1. Na takie liczby rozkłada się 13. Takie potęgi bardzo łatwo otrzymać. Potrzebujemy 3 mnożeń do wyliczenia wszystkich niezbędnych potęg macierzy A. Aby ostatecznie otrzymać A13, potrzebne są jeszcze dwa dodatkowe mnożenia, czyli w sumie 5 mnożeń. Poprzedni algorytm doszedłby do tego samego wyniku po wykonaniu aż 12 mnożeń. Przy większych potęgach zysk jest jeszcze większy.
27 Wykładnika k wcale nie musimy rozbijać na potęgi liczby 2. W pamięci komputera k jest przechowywane w postaci binarnej. Wystarczy testować stan odpowiednich bitów k: kolejne potęgi liczby 2 = bity k = numery pozycji bitów kolejnych = Zasada pracy algorytmu jest następująca: W macierzy wyniku W ustawiamy macierz jednostkową. Dopóki k jest większe od zera, testujemy najmłodszy bit k i jeśli ma on wartość 1, to wykonujemy mnożenie W = W A. Bity k przesuwamy o 1 w prawo, aby pozbyć się testowanego bitu. Jeśli po tej operacji k ma wartość 0, to potęgowanie jest zakończone i przerywamy pętlę. W przeciwnym razie macierz A podnosimy do kwadratu: A = A A i pętlę kontynuujemy. Gdy pętla się zakończy, przepisujemy macierz W do A.
28 Wejście n stopień macierzy, n N, n > 0 A potęgowana macierz, A R k wykładnik potęgowy, k N, k 0 Wyjście: A zawiera k-tą potęgę wejściowej macierzy A. Elementy pomocnicze: W macierz pomocnicza, tworzony jest w niej wynik potęgowania, W R P macierz pomocnicza, P R Lista kroków: K01: Ustaw macierz jednostkową w W K02: Dopóki k > 0, wykonuj K03...K09 ; w pętli obliczamy k-tą potęgę A K03: Jeśli k and 1 = 0, to idź do K06 ; testujemy kolejne bity k K04 P W A ; jeśli bit jest ustawiony, to do W dołączamy A K05: W P K06: k k shr 1 ; przesuwamy w prawo bity k K07: Jeśli k = 0, to idź do K10 K08: P A A ; wyznaczamy kolejny kwadrat A K09 A P K10: A W ; wynik do A K11: Zakończ
29 // procedura wylicza potęgę k-tą macierzy A // void potega(int k, int n, double ** A) double ** P, ** W; int i; // Szybkie potęgowanie macierzy // Data: // (C)2012 mgr Jerzy Wałaszek // #include <iostream> #include <iomanip> using namespace std; // procedura mnożenia macierzy // C = A x B // void mnoz(int n, double ** A, double ** B, double ** C) int i,j,k; double s; for(j = 0; j < n; j++) s = 0; for(k = 0; k < n; k++) s += A[i][k] * B[k][j]; C[i][j] = s; // procedura przepisuje macierz A do macierzy B // void przepisz(int n, double ** A, double ** B) int i,j; for(j = 0; j < n; j++) B[i][j] = A[i][j]; // procedura ustawia w macierzy A macierz jednostkową // void jednostkowa(int n, double ** A) int i,j; for(j = 0; j < n; j++) A[i][j] = 0; A[i][i] = 1; // tworzymy macierze W i P W = new double * [n]; P = new double * [n]; W[i] = new double[n]; P[i] = new double[n]; // w macierzy W ustawiamy macierz jednostkową jednostkowa(n,w); // w pętli obliczamy potęgę macierzy A w W while(k) if(k & 1) // testujemy najmłodszy bit k mnoz(n,w,a,p); // jeśli ustawiony, to przepisz(n,p,w); // W = W x A k >>= 1; // przesuwamy bity k w prawo if(!k) break; // jeśli brak bitów 1, przerywamy mnoz(n,a,a,p); // A = A x A przepisz(n,p,a); // wynik potęgowania wraca do macierzy A przepisz(n,w,a); // usuwamy macierze W i P delete [] W[i]; delete [] P[i]; delete [] W; delete [] P; //*** PROGRAM GŁÓWNY *** // int main() double ** A; int n,i,j,k; cout << fixed << setprecision(2); // wczytujemy wykładnik k oraz stopień macierzy n cin >> k >> n; // tworzymy macierz dynamiczną i wczytujemy dane wierszami A = new double * [n]; A[i] = new double[n]; for(j = 0; j < n; j++) cin >> A[i][j]; // obliczamy k-tą potęgę A potega(k,n,a); // wyświetlamy wyniki cout << endl; for(j = 0; j < n; j++) cout << setw(10) << A[i][j] << " "; cout << endl; // usuwamy macierz A delete [] A[i]; delete [] A; return 0;
30 Problem: Obliczyć wyznacznik macierzy kwadratowej A n n za pomocą rozwinięcia Laplace'a. Wyznacznik (ang. determinant oznaczany det) jest liczbą, która została skojarzona z daną macierzą kwadratową A. Rozwinięcie Laplace'a pozwala w sposób rekurencyjny policzyć wyznacznik dowolnej macierzy kwadratowej. Wzór jest następujący: A macierz kwadratowa o rozmiarze n, której wyznacznik liczymy i ustalony wiersz macierzy A, wg którego dokonujemy rozwinięcia Laplace'a j kolejne numery kolumn w macierzy A ai,j element macierzy A leżący w i-tym wierszu i j-tej kolumnie Mi,j minor elementu ai,j - jest to wyznacznik macierzy powstałej z A po usunięciu z niej i-tego wiersza i j-tej kolumny
31 Powyższy wzór jest rekurencyjny, ponieważ występuje w nim Minor, który sam jest wyznacznikiem, a zatem obliczamy go za pomocą tego samego wzoru. Dla przykładu obliczmy wyznacznik macierzy: Jako wiersz rozwinięcia wybierzemy pierwszy wiersz zawierający elementy 1, 2 i 3. Dla każdego z tych elementów musimy wyznaczyć minory. Najpierw wyznaczmy macierze minorowe:
32 Obliczamy wyznaczniki M. Rozwijamy je wg pierwszego wiersza. Minory macierzy o rozmiarze 2 są macierzami jednoelementowymi. Wyznacznik macierzy jednoelementowej jest równy temu elementowi: M1,1 = (-1) (-1) M1,1 = (-1) (-1)3 28 M1,1 = M1,1 = -18 M1,2 = (-1) (-1) M1,2 = (-1) (-1)3 12 M1,2 = M1,2 = 0 M1,3 = (-1) (-1) M1,3 = (-1) (-1)3 15 M1,3 = M1,3 = 27
33 Mając policzone wartości minorów, możemy przystąpić do wyznaczenia wyznacznika macierzy A: det A = (-1) M 1,1 + (-1) M 1,2 + (-1) M 1,3 det A = (-1) 2 M 1,1 + (-1) 3 2M 1,2 + (-1) 4 3M 1,3 det A = M 1,1-2M 1,2 + 3M 1,3 det A = det A = 63 Możemy już przystąpić do wstępnego określenia algorytmu. Wyznacznik macierzy A n n obliczamy następująco: Jeśli n = 1, to wyznacznik macierzy jest równy wartości elementu tej macierzy, czyli: det A 1 1 = det [ a 1 ] = a 1
34 Dla n > 1 wybieramy dowolny wiersz lub kolumnę (najlepiej taki, w którym jest najwięcej zer). Następnie każdy wyraz tego wiersza lub kolumny przemnażamy przez wyznacznik macierzy, która powstaje przez usunięcie wiersza i kolumny z mnożonym wyrazem (wyznacznik ten obliczamy rekurencyjnie tą samą metodą). Jeśli suma numeru wiersza i kolumny mnożonego wyrazu jest nieparzysta, to otrzymany iloczyn mnożymy dodatkowo przez -1. Wyliczone iloczyny sumujemy otrzymując wartość wyznacznika. Klasa złożoności obliczeniowej podanej metody jest równa O(n!). Dokonajmy prostej analizy. Wyznacznik wyliczamy mnożąc kolejne wyrazy wiersza (lub kolumny) przez wartości wyznaczników niższego poziomu i sumując otrzymane iloczyny (dochodzi jeszcze ewentualna zmiana znaku). Zatem dla wyznacznika n-tego poziomu musimy wyliczyć n wyznaczników poziomu (n-1). Czyli: ilość mnożeń = n ilość mnożeń dla wyznacznika poziomu n - 1 ilość dodawań = n ilość dodawań dla wyznacznika poziomu n (n - 1) dodawań iloczynów
35 W poniższej tabeli wyliczyliśmy ilości mnożeń i dodawań dla kilku kolejnych wartości n. Złożoność obliczeniowa operacji wyliczania wyznacznika macierzy n Ilość dodawań ilość mnożeń 1 d 1 = 0 m 1 = 0 2 d 2 = 1 = 2d m 2 = 2 3 d 3 = 5 = 3d m 3 = 6 = 3m 2 4 d 4 = 23 = 4d m 4 = 24 = 4m 3 5 d 5 = 119 = 5d m 5 = 120 = 5m 4 Widać wyraźnie, iż od wartości n = 2 ilość mnożeń jest równa n!, a ilość dodawań jest równa n! - 1. Prowadzi to do bardzo szybkiego wzrostu czasu wykonania algorytmu. Pozostaje drobna kwestia techniczna. W algorytmie obliczamy wyznaczniki macierzy, które powstają przez usunięcie z macierzy głównej wiersza i kolumny z elementem mnożącym. Aby uniknąć kopiowania elementów, do algorytmu wyliczającego wyznacznik będziemy przekazywali wektor numerów kolumn, w którym umieścimy kolejne numery kolumn zawarte w tej podmacierzy oraz numer pierwszego wiersza. Na przykład w poniższej macierzy chcemy wyliczyć wyznacznik wg elementu a1,3:
36 podmacierz wektor kolumn 1 a 1,1 a 1,2 a 1, a 1,4 2 a 2,1 a 2,2 a a 2,1 a 2,2 a 2,3 2,4 a 2,4 3 a 3,1 a 3,2 a 3,4 3 a 3,1 a 3,2 a 3,3 numer wiersza = 2 a 3,4 4 a 4,1 a 4,2 a 4,4 4 a 4,1 a 4,2 a 4,3 a 4,4 Dane te jednoznacznie określą podmacierz, której wyznacznik należy wyliczyć. Zwróć uwagę, iż wektor kolumn zawiera tyle elementów, ile wynosi stopień wyznacznika. Numer wiersza zawsze będzie numerem o 1 większym od wiersza zawierającego mnożony przez wyznacznik element. Do elementów podmacierzy będziemy się odwoływać zawsze poprzez wektor kolumn.
37 Wejście n określa stopień wyznacznika do obliczenia. n N w określa numer wiersza, w którym rozpoczyna się podmacierz. w N WK wektor kolumn. Zawiera numery kolumn z macierzy głównej, które zawiera podmacierz. WK zawiera tyle numerów kolumn, ile wynosi stopień wyznacznika. Elementy N i są numerowane od 0. A macierz, której wyznacznik liczymy. Wiersze i kolumny są numerowane od zera. A R Wyjście: Wynik działania funkcji det(n,w,wk,a) jest wartością wyznacznika Elementy pomocnicze: i,j,k zmienne pomocnicze dla pętli i,j,k N m mnożnik iloczynu wyrazu macierzy przez wyznacznik podmacierzy. Przyjmuje na przemian wartości 1 oraz (-1), m C. KK wektor kolumn umożliwiający rekurencyjne przekazywanie numerów kolumn podmacierzy, dla których liczone są wyznaczniki. Elementami wektora kolumn są liczby całkowite. Elementy C i są numerowane od zera. Wektor KK ma o jeden element mniej niż wektor WK otrzymany na wejściu. s zlicza sumę iloczynów wyrazów wiersza przez wyznaczniki niższych stopni. s R
38 Lista kroków: Funkcja rekurencyjna det(n,w,wk,a): Parametrami funkcji są: n stopień podmacierzy przekazywane przez wartość w bieżący wiersz macierzy głównej, w którym rozpoczyna się podmacierz przekazywane przez wartość WK wektor kolumn o n elementach przekazanie przez referencję A macierz podstawowa przekazanie przez referencję K01: Jeśli n = 1, to zakończ z wynikiem A[w][WK[0]] ; sprawdzamy zakończenie rekurencji zwracamy wynik funkcji K02: Utwórz wektor KK o n-1 elementach ; tworzymy tablicę dynamiczną K03: s 0 ; przygotowujemy się do sumowania iloczynów wyrazów przez minory K04: m 1 ; mnożnik (-1)i+j K05: Dla i = 0,1,...,n - 1 wykonuj K06...K12 ; rozpoczynamy pętlę obliczającą rekurencyjnie rozwinięcie Laplace'a K06: k 0 ; przygotowujemy wektor kolumn dla wywołania rekurencyjnego K07: Dla j = 0,1,...,n - 2 wykonuj K08...K10 K08: Jeśli k = i, to k k + 1 ; pomijamy kolumnę z bieżącym wyrazem K09: KK[j] WK[k] ; przepisujemy kolumny z WK do KK pomijając bieżącą K10: k k + 1 K11: s s + m A[w][WK[i]] det(n - 1, w + 1, KK, A) ; wywołanie rekurencyjne K12: m (- m) ; następny mnożnik (-1)i+j K13: Usuń wektor KK ; tablica dynamiczna przestaje być potrzebna, zwalniamy pamięć K12: Zakończ z wynikiem s ; wynik funkcji
39 // Wyznacznik wg rekurencyjnego rozwinięcia Laplace'a // Data : // (C)2012 mgr Jerzy Wałaszek // #include <iostream> #include <iomanip> using namespace std; // Rekurencyjna funkcja obliczająca rozwinięcie Laplace'a // double det(int n, int w, int * WK, double ** A) int i,j,k,m, * KK; double s; if(n == 1) return A[w][WK[0]]; else // sprawdzamy warunek zakończenia rekurencji // macierz 1 x 1, wyznacznik równy elementowi //*** PROGRAM GŁÓWNY *** // int main() int n,i,j; // stopień macierzy int * WK; // wektor kolumn double ** A; // macierz cout << fixed << setprecision(4); cin >> n; A = new double * [n]; A[i] = new double[n]; for(j = 0; j < n; j++) cin >> A[i][j]; // odczytujemy stopień macierzy // tworzymy macierz wskaźników // tworzymy wiersz // czytamy wiersz macierzy KK = new int[n - 1]; // tworzymy dynamiczny wektor kolumn WK = new int[n]; // tworzymy wiersz kolumn s = 0; m = 1; // zerujemy wartość rozwinięcia // początkowy mnożnik WK[i] = i; // wypełniamy go numerami kolumn // pętla obliczająca rozwinięcie k = 0; // tworzymy wektor kolumn dla rekurencji for(j = 0; j < n - 1; j++) // ma on o 1 kolumnę mniej niż WK if(k == i) k++; // pomijamy bieżącą kolumnę KK[j] = WK[k++]; // pozostałe kolumny przenosimy do KK s += m * A[w][WK[i]] * det(n - 1,w + 1, KK, A); cout << endl; cout << det(n, 0, WK, A) << endl; // obliczamy i wyświetlamy wyznacznik delete [] WK; // usuwamy tablice dynamiczne delete [] A[i]; delete [] A; m = -m; // kolejny mnożnik delete [] KK; return s; // usuwamy zbędną już tablicę dynamiczną // ustalamy wartość funkcji
MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata
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
Bardziej szczegółowoLiczby całkowite i rzeczywiste
Wykład 4(20 marzec 2014r.) Liczby całkowite i rzeczywiste Paulina Rogowiecka Klaudia Kamińska Adrianna Znyk 1 Spis treści: Czynniki pierwsze metoda próbnych dzieleń Pierwszość liczby naturalnej algorytmy
Bardziej szczegółowoUniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy
Uniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy Matematyka, królowa nauk Edycja X - etap 2 Bydgoszcz, 16 kwietnia 2011 Fordoński
Bardziej szczegółowo(3 kwiecień 2014) Marika Pankowska Kamila Pietrzak
(3 kwiecień 2014) Marika Pankowska Kamila Pietrzak Wyszukiwanie liniowe (ang. linear search), zwane również sekwencyjnym (ang. sequential search) polega na przeglądaniu kolejnych elementów zbioru Z. Jeśli
Bardziej szczegółowotyp y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury
typy złożone- tablice wielowymiarowe, struktury Wykład 6 Deklarowanie wskaźników nazwa_typu * nazwa_wskaznika; WSKAŹNIKI: PRZYPOMNIENIE Przypisywanie wskaźnikom wartości double * pn = &zmienna_typu_double;
Bardziej szczegółowoPodstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne
1 Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion,
Bardziej szczegółowoTablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119
Tablice Tablica to struktura danych, która może przechowywać wiele wartości tego samego typu. Na przykład tablica może zawierać: 10 wartości typu int opisujących liczbę studentów przyjętych na kierunek
Bardziej szczegółowor. Tablice podstawowe operacje na tablicach
27.03.2014r. Tablice podstawowe operacje na tablicach Tablica - definicja Tablica (ang. array) lub wektor (ang. vector) jest złożoną strukturą danych (ang. compound data structure) zbudowaną z ciągu elementów
Bardziej szczegółowoProgramowanie - wykład 4
Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include
Bardziej szczegółowoO podstawowych operacjach na tablicach. Mateusz Ziółkowski, MBiU II
Wykład Ⅴ O podstawowych operacjach na tablicach Mateusz Ziółkowski, MBiU II Czym są tablice? Tablica (ang. array) to zespół równorzędnych zmiennych, posiadających wspólną nazwę. Jego poszczególne elementy
Bardziej szczegółowoAnna Sobocińska Sylwia Piwońska
Anna Sobocińska Sylwia Piwońska Problem Wyszukiwanie liniowe W n-elementowym zbiorze Z wyszukać element posiadający pożądane własności. Wyszukiwanie liniowe (ang. linear search), zwane również sekwencyjnym
Bardziej szczegółowo5. Rozwiązywanie układów równań liniowych
5. Rozwiązywanie układów równań liniowych Wprowadzenie (5.1) Układ n równań z n niewiadomymi: a 11 +a 12 x 2 +...+a 1n x n =a 10, a 21 +a 22 x 2 +...+a 2n x n =a 20,..., a n1 +a n2 x 2 +...+a nn x n =a
Bardziej szczegółowoMacierze. Rozdział Działania na macierzach
Rozdział 5 Macierze Funkcję, która każdej parze liczb naturalnych (i, j) (i 1,..., n; j 1,..., m) przyporządkowuje dokładnie jedną liczbę a ij F, gdzie F R lub F C, nazywamy macierzą (rzeczywistą, gdy
Bardziej szczegółowoAlgorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie
Algorytmika i programowanie Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie Tablice Tablica jest zbiorem elementów tego samego typu. Każdy element jest identyfikowany (numer
Bardziej szczegółowo15. Macierze. Definicja Macierzy. Definicja Delty Kroneckera. Definicja Macierzy Kwadratowej. Definicja Macierzy Jednostkowej
15. Macierze Definicja Macierzy. Dla danego ciała F i dla danych m, n IN funkcję A : {1,...,m} {1,...,n} F nazywamy macierzą m n ( macierzą o m wierszach i n kolumnach) o wyrazach z F. Wartość A(i, j)
Bardziej szczegółowoMacierzowe algorytmy równoległe
Macierzowe algorytmy równoległe Zanim przedstawimy te algorytmy zapoznajmy się z metodami dekompozycji macierzy, możemy wyróżnić dwa sposoby dekompozycji macierzy: Dekompozycja paskowa - kolumnowa, wierszowa
Bardziej szczegółowoWykład 5. Metoda eliminacji Gaussa
1 Wykład 5 Metoda eliminacji Gaussa Rozwiązywanie układów równań liniowych Układ równań liniowych może mieć dokładnie jedno rozwiązanie, nieskończenie wiele rozwiązań lub nie mieć rozwiązania. Metody dokładne
Bardziej szczegółowoRozdział 5. Macierze. a 11 a a 1m a 21 a a 2m... a n1 a n2... a nm
Rozdział 5 Macierze Funkcję, która każdej parze liczb naturalnych (i,j) (i = 1,,n;j = 1,,m) przyporządkowuje dokładnie jedną liczbę a ij F, gdzie F = R lub F = C, nazywamy macierzą (rzeczywistą, gdy F
Bardziej szczegółowoZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015
POLITECHNIKA WARSZAWSKA Instytut Automatyki i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015 Język programowania: Środowisko programistyczne: C/C++ Qt Wykład 4 : Napisy. Tablice dwuwymiarowe. Formaty
Bardziej szczegółowoDefinicja macierzy Typy i właściwości macierzy Działania na macierzach Wyznacznik macierzy Macierz odwrotna Normy macierzy RACHUNEK MACIERZOWY
Transport, studia niestacjonarne I stopnia, semestr I Instytut L-5, Wydział Inżynierii Lądowej, Politechnika Krakowska Adam Wosatko Ewa Pabisek Czym jest macierz? Definicja Macierzą A nazywamy funkcję
Bardziej szczegółowoMetody i analiza danych
2015/2016 Metody i analiza danych Macierze Laboratorium komputerowe 2 Anna Kiełbus Zakres tematyczny 1. Funkcje wspomagające konstruowanie macierzy 2. Dostęp do elementów macierzy. 3. Działania na macierzach
Bardziej szczegółowoProgramowanie i struktury danych
Programowanie i struktury danych 1 / 30 STL Standard Template Library, STL (ang. = Standardowa Biblioteka Wzorców) biblioteka C++ zawierająca szablony (wzorce), które umożliwiają wielokrotne użycie. Główne
Bardziej szczegółowowagi cyfry 7 5 8 2 pozycje 3 2 1 0
Wartość liczby pozycyjnej System dziesiętny W rozdziale opiszemy pozycyjne systemy liczbowe. Wiedza ta znakomicie ułatwi nam zrozumienie sposobu przechowywania liczb w pamięci komputerów. Na pierwszy ogień
Bardziej szczegółowoSortowanie przez wstawianie Insertion Sort
Sortowanie przez wstawianie Insertion Sort Algorytm sortowania przez wstawianie można porównać do sposobu układania kart pobieranych z talii. Najpierw bierzemy pierwszą kartę. Następnie pobieramy kolejne,
Bardziej szczegółowoWstęp do Informatyki
Wstęp do Informatyki Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 11 Bożena Woźna-Szcześniak (AJD) Wstęp do Informatyki Wykład 11 1 / 52 Pętla for # i n c l u d e
Bardziej szczegółowoEkoenergetyka Matematyka 1. Wykład 3.
Ekoenergetyka Matematyka Wykład 3 MACIERZE Macierzą wymiaru n m, gdzie nm, nazywamy prostokątną tablicę złożoną z n wierszy i m kolumn: a a2 a j am a2 a22 a2 j a2m [ a ] nm A ai ai 2 a aim - i-ty wiersz
Bardziej szczegółowoWykład 6. Metoda eliminacji Gaussa: Eliminacja z wyborem częściowym Eliminacja z wyborem pełnym
1 Wykład 6 Metoda eliminacji Gaussa: Eliminacja z wyborem częściowym Eliminacja z wyborem pełnym ELIMINACJA GAUSSA Z WYBOREM CZĘŚCIOWYM ELEMENTÓW PODSTAWOWYCH 2 Przy pomocy klasycznego algorytmu eliminacji
Bardziej szczegółowoInformacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char
Programowanie C++ Informacje wstępne #include - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char = -128 do 127, unsigned char = od
Bardziej szczegółowoWymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:
5 Tablice Tablica jest zestawem obiektów (zmiennych) tego samego typu, do których można się odwołać za pomocą wspólnej nazwy. Obiekty składowe tablicy noszą nazwę elementów tablicy. Dostęp do nich jest
Bardziej szczegółowoProgramowanie obiektowe W3
Programowanie obiektowe W3 Przegląd typów strukturalnych w C++ : tablice statyczne i dynamiczne Dr hab. inż. Lucyna Leniowska, prof. UR Zakład Mechatroniki, Automatyki i Optoelektroniki Typy złożone: tablice
Bardziej szczegółowoZmienne i struktury dynamiczne
Zmienne i struktury dynamiczne Zmienne dynamiczne są to zmienne, które tworzymy w trakcie działania programu za pomocą operatora new. Usuwa się je operatorem delete. Czas ich występowania w programie jest
Bardziej szczegółowoRACHUNEK MACIERZOWY. METODY OBLICZENIOWE Budownictwo, studia I stopnia, semestr 6. Instytut L-5, Wydział Inżynierii Lądowej, Politechnika Krakowska
RACHUNEK MACIERZOWY METODY OBLICZENIOWE Budownictwo, studia I stopnia, semestr 6 Instytut L-5, Wydział Inżynierii Lądowej, Politechnika Krakowska Ewa Pabisek Czym jest macierz? Definicja Macierzą A nazywamy
Bardziej szczegółowoWYKŁAD 3 (13 MARZEC 2014) LICZBY CAŁKOWITE I RZECZYWISTE. Bartosz Łakomy i Dariusz Dobiesz
WYKŁAD 3 (13 MARZEC 2014) LICZBY CAŁKOWITE I RZECZYWISTE Bartosz Łakomy i Dariusz Dobiesz SPIS TREŚCI: Liczby parzyste i nieparzyste Liczby podzielne lub niepodzielne przez zadane podzielniki NWD algorytm
Bardziej szczegółowoZajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej
Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()
Bardziej szczegółowoMACIERZE I WYZNACZNIKI
Wykłady z matematyki inżynierskiej IMiF UTP 07 MACIERZ DEFINICJA. Macierza o m wierszach i n kolumnach nazywamy przyporza dkowanie każdej uporza dkowanej parze liczb naturalnych (i, j), gdzie 1 i m, 1
Bardziej szczegółowoutworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Bardziej szczegółowoProgramowanie dynamiczne
Programowanie dynamiczne Ciąg Fibonacciego fib(0)=1 fib(1)=1 fib(n)=fib(n-1)+fib(n-2), gdzie n 2 Elementy tego ciągu stanowią liczby naturalne tworzące ciąg o takiej własności, że kolejny wyraz (z wyjątkiem
Bardziej szczegółowoPODSTAWY AUTOMATYKI. MATLAB - komputerowe środowisko obliczeń naukowoinżynierskich - podstawowe operacje na liczbach i macierzach.
WYDZIAŁ ELEKTROTECHNIKI I AUTOMATYKI Katedra Inżynierii Systemów Sterowania PODSTAWY AUTOMATYKI MATLAB - komputerowe środowisko obliczeń naukowoinżynierskich - podstawowe operacje na liczbach i macierzach.
Bardziej szczegółowoO MACIERZACH I UKŁADACH RÓWNAŃ
O MACIERZACH I UKŁADACH RÓWNAŃ Problem Jak rozwiązać podany układ równań? 2x + 5y 8z = 8 4x + 3y z = 2x + 3y 5z = 7 x + 8y 7z = Definicja Równanie postaci a x + a 2 x 2 + + a n x n = b gdzie a, a 2, a
Bardziej szczegółowo1 Macierze i wyznaczniki
1 Macierze i wyznaczniki 11 Definicje, twierdzenia, wzory 1 Macierzą rzeczywistą (zespoloną) wymiaru m n, gdzie m N oraz n N, nazywamy prostokątną tablicę złożoną z mn liczb rzeczywistych (zespolonych)
Bardziej szczegółowoPROBLEM. Znaleźć rozkład liczby p > 1. na iloczyn czynników pierwszych.
PROBLEM Znaleźć rozkład liczby p > 1. na iloczyn czynników pierwszych. Postawiony problem posiada bardzo duże znaczenie w wielu dziedzinach informatyki szczególnie w kryptografii. Na dzień dzisiejszy nie
Bardziej szczegółowoLuty 2001 Algorytmy (7) 2000/2001 s-rg@siwy.il.pw.edu.pl
System dziesiętny 7 * 10 4 + 3 * 10 3 + 0 * 10 2 + 5 *10 1 + 1 * 10 0 = 73051 Liczba 10 w tym zapisie nazywa się podstawą systemu liczenia. Jeśli liczba 73051 byłaby zapisana w systemie ósemkowym, co powinniśmy
Bardziej szczegółowoRozwiązanie. #include <cstdlib> #include <iostream> using namespace std;
Programowanie C++ Zadanie 1 Napisz program do obliczenia sumy i iloczynu ciągu liczb zakooczonego liczbą zero. Zakładamy, że ciąg zawiera co najmniej jedną liczbę (założenie to jest konieczne przy obliczeniu
Bardziej szczegółowo; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...
Tekst na niebiesko jest komentarzem lub treścią zadania. Zadanie. Dane są macierze: A D 0 ; E 0 0 0 ; B 0 5 ; C Wykonaj poniższe obliczenia: 0 4 5 Mnożenia, transpozycje etc wykonuję programem i przepisuję
Bardziej szczegółowoZaawansowane algorytmy i struktury danych
Zaawansowane algorytmy i struktury danych u dr Barbary Marszał-Paszek Opracowanie pytań praktycznych z egzaminów. Strona 1 z 12 Pytania praktyczne z kolokwium zaliczeniowego z 19 czerwca 2014 (studia dzienne)
Bardziej szczegółowoWprowadzenie do Scilab: macierze
Wprowadzenie do Scilab: macierze Narzędzia Informatyki Magdalena Deckert Izabela Szczęch Barbara Wołyńska Bartłomiej Prędki Politechnika Poznańska Instytut Informatyki Agenda Definiowanie macierzy Funkcje
Bardziej szczegółowon, m : int; S, a, b : double. Gdy wartości sumy składowej nie można obliczyć, to przyjąć Sij = 1.03 Dla obliczenia Sij zdefiniować funkcję.
Zadania-6 1 Opracować program obliczający wartość sumy: S n m ai bj i 1 j 1 ln( bi j a) n, m : int; S, a, b : double Gdy wartości sumy składowej nie można obliczyć, to przyjąć Sij = 103 Dla obliczenia
Bardziej szczegółowoPodstawy Programowania
Podstawy Programowania Monika Wrzosek Instytut Matematyki Uniwersytet Gdański Matematyka 2017/18 Monika Wrzosek (IM UG) Podstawy Programowania 1 / 119 Sprawy organizacyjne E-mail: mwrzosek@mat.ug.edu.pl
Bardziej szczegółowoOpis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja
Opis zagadnieo 1-3 Iteracja, rekurencja i ich realizacja Iteracja Iteracja to czynnośd powtarzania (najczęściej wielokrotnego) tej samej instrukcji (albo wielu instrukcji) w pętli. Mianem iteracji określa
Bardziej szczegółowo3. Macierze i Układy Równań Liniowych
3. Macierze i Układy Równań Liniowych Rozważamy równanie macierzowe z końcówki ostatniego wykładu ( ) 3 1 X = 4 1 ( ) 2 5 Podstawiając X = ( ) x y i wymnażając, otrzymujemy układ 2 równań liniowych 3x
Bardziej szczegółowoKrótkie wprowadzenie do macierzy i wyznaczników
Radosław Marczuk Krótkie wprowadzenie do macierzy i wyznaczników 12 listopada 2005 1. Macierze Macierzą nazywamy układ liczb(rzeczywistych, bądź zespolonych), funkcji, innych macierzy w postaci: A a 11
Bardziej szczegółowoWstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)
1 Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną) Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion,
Bardziej szczegółowoProgramowanie dynamiczne
Programowanie dynamiczne Programowanie rekurencyjne: ZALETY: - prostota - naturalność sformułowania WADY: - trudność w oszacowaniu zasobów (czasu i pamięci) potrzebnych do realizacji Czy jest możliwe wykorzystanie
Bardziej szczegółowoPodstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Bardziej szczegółowo1 Układy równań liniowych
II Metoda Gaussa-Jordana Na wykładzie zajmujemy się układami równań liniowych, pojawi się też po raz pierwszy macierz Formalną (i porządną) teorią macierzy zajmiemy się na kolejnych wykładach Na razie
Bardziej szczegółowoProgramowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41
Programowanie w C++ Wykład 2 Katarzyna Grzelak 5 marca 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41 Reprezentacje liczb w komputerze K.Grzelak (Wykład 1) Programowanie w C++ 2 / 41 Reprezentacje
Bardziej szczegółowoWstęp do programowania
wykład 7 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2016/2017 Losowanie liczb całkowitych Dostępne biblioteki Najprostsze losowanie liczb całkowitych można wykonać za pomocą funkcji
Bardziej szczegółowodo instrukcja while (wyrażenie);
Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie
Bardziej szczegółowoCzęść 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
Bardziej szczegółowoWieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa
Wieczorowe Studia Licencjackie Wrocław, 7.11.2006 Wstęp do programowania Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa Zaprezentujemy teraz algorytm na wyznaczanie wszystkich
Bardziej szczegółowoZestaw 12- Macierz odwrotna, układy równań liniowych
Zestaw - Macierz odwrotna, układy równań liniowych Przykładowe zadania z rozwiązaniami Załóżmy, że macierz jest macierzą kwadratową stopnia n. Mówimy, że macierz tego samego wymiaru jest macierzą odwrotną
Bardziej szczegółowoTablice są typem pochodnym. Poniżej mamy przykłady deklaracji różnych tablic:
Tablice TEORIA Tablica to ciąg obiektów tego samego typu, które zajmują ciągły obszar w pamięci. Dzięki stosowaniu tablic, zamiast nazywania każdej z np. stu zmiennych osobno możemy zabudować tablicę 100-elementową,
Bardziej szczegółowo// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.
Wykład 10 Przykłady różnych funkcji (cd) - przetwarzanie tablicy tablic (tablicy "dwuwymiarowej") - sortowanie przez "selekcję" Dynamiczna alokacja pamięci 1 // Liczy srednie w wierszach i kolumnach tablicy
Bardziej szczegółowoWykład 7 Macierze i wyznaczniki
Wykład 7 Macierze i wyznaczniki Andrzej Sładek sladek@ux2mathusedupl Instytut Matematyki, Uniwersytet Śląski w Katowicach Andrzej Sładek (Instytut Matematyki, Uniwersytet Śląski Wykład w Katowicach) 7
Bardziej szczegółowoAnaliza algorytmów zadania podstawowe
Analiza algorytmów zadania podstawowe Zadanie 1 Zliczanie Zliczaj(n) 1 r 0 2 for i 1 to n 1 3 do for j i + 1 to n 4 do for k 1 to j 5 do r r + 1 6 return r 0 Jaka wartość zostanie zwrócona przez powyższą
Bardziej szczegółowo0 + 0 = 0, = 1, = 1, = 0.
5 Kody liniowe Jak już wiemy, w celu przesłania zakodowanego tekstu dzielimy go na bloki i do każdego z bloków dodajemy tak zwane bity sprawdzające. Bity te są w ścisłej zależności z bitami informacyjnymi,
Bardziej szczegółowoWskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to
Bardziej szczegółowo1 Wskaźniki. 1.1 Główne zastosowania wskaźników
1 Wskaźniki Wskaźnik (ang. pointer) jest obiektem (zmienną) przechowującym adres pamięci. Definiowanie wskaźników: typ *nazwa wskaznika; np.: int *wsk na x;, double *xxx;, char *znak;. Aby można było pracować
Bardziej szczegółowotablica: dane_liczbowe
TABLICE W JĘZYKU C/C++ tablica: dane_liczbowe float dane_liczbowe[5]; dane_liczbowe[0]=12.5; dane_liczbowe[1]=-0.2; dane_liczbowe[2]= 8.0;... 12.5-0.2 8.0...... 0 1 2 3 4 indeksy/numery elementów Tablica
Bardziej szczegółowoUkłady równań liniowych. Krzysztof Patan
Układy równań liniowych Krzysztof Patan Motywacje Zagadnienie kluczowe dla przetwarzania numerycznego Wiele innych zadań redukuje się do problemu rozwiązania układu równań liniowych, często o bardzo dużych
Bardziej szczegółowoKontrola przebiegu programu
Kontrola przebiegu programu Wykład 9 Instrukcje sterujące: pętle rozgałęzienia skoki PRZYPOMINAJKA Zadanie : Zaprojektuj rekurencyjny przepis na wyznaczenie największej takiej liczby m, że 2 m jest podzielnikiem
Bardziej szczegółowoStruktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.
Struktura programu Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem. W ostatnich latach najbardziej używanym stylem oprogramowania
Bardziej szczegółowo2. Układy równań liniowych
2. Układy równań liniowych Grzegorz Kosiorowski Uniwersytet Ekonomiczny w Krakowie zima 2017/2018 rzegorz Kosiorowski (Uniwersytet Ekonomiczny w Krakowie) 2. Układy równań liniowych zima 2017/2018 1 /
Bardziej szczegółowo5. Rekurencja. Przykłady
5. Rekurencja Uwaga! W tym rozdziale nie są omówione żadne nowe konstrukcje języka C++. Omówiona jest za to technika wykorzystująca funkcje, która pozwala na rozwiązanie pewnych nowych rodzajów zadań.
Bardziej szczegółowoPodstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy
1 Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com
Bardziej szczegółowoPodstawy algorytmiki i programowania - wykład 1 Tablice powtórzenie Tablice znaków Tablice dwuwymiarowe
Podstawy algorytmiki i programowania - wykład 1 Tablice powtórzenie Tablice znaków Tablice dwuwymiarowe Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie
Bardziej szczegółowoRekurencja. Przygotowała: Agnieszka Reiter
Rekurencja Przygotowała: Agnieszka Reiter Definicja Charakterystyczną cechą funkcji (procedury) rekurencyjnej jest to, że wywołuje ona samą siebie. Drugą cechą rekursji jest jej dziedzina, którą mogą być
Bardziej szczegółowoRozwiązywanie układów równań liniowych
Rozwiązywanie układów równań liniowych Marcin Orchel 1 Wstęp Jeśli znamy macierz odwrotną A 1, to możęmy znaleźć rozwiązanie układu Ax = b w wyniku mnożenia x = A 1 b (1) 1.1 Metoda eliminacji Gaussa Pierwszy
Bardziej szczegółowoPodstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej
Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok
Bardziej szczegółowoWstęp do programowania. Wykład 1
Wstęp do programowania Wykład 1 1 / 49 Literatura Larry Ullman, Andreas Signer. Programowanie w języku C++. Walter Savitch, Kenrick Mock. Absolute C++. Jerzy Grębosz. Symfonia C++. Standard. Stephen Prata.
Bardziej szczegółowoUwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].
Zadanie 1. Wiązka zadań Od szczegółu do ogółu Rozważmy następujący algorytm: Dane: Algorytm 1: k liczba naturalna, A[1...2 k ] tablica liczb całkowitych. n 1 dla i=1,2,,k wykonuj n 2n s 1 dopóki s
Bardziej szczegółowoZadanie 2: Arytmetyka symboli
1 Cel ćwiczenia Zadanie 2: Arytmetyka symboli Wykształcenie umiejętności abstrahowania operacji arytmetycznych. Zapoznanie się i przećwiczenie mechanizmu tworzenia przeciążeń funkcji operatorowych. Utrwalenie
Bardziej szczegółowoWykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe
I. Struktury sterujące.bezpośrednie następstwo (A,B-czynności) Wykład _2 Algorytmy sortowania tablic Sortowanie bąbelkowe Elementy języka stosowanego do opisu algorytmu Elementy Poziom koncepcji Poziom
Bardziej szczegółowo4. Napisz program wyznaczający wartość funkcji. f (x) = x cos x + e 4x 7. w zadanym punkcie.
Zadania 1. Napisz program, który wyświetla na ekranie komunikat Witaj. 2. Napisz program przeliczający wielkość kąta wyrażoną w stopniach na radiany według wzoru π Rad = St 180. Liczba π ma w języku C++
Bardziej szczegółowoWykład 4. Informatyka Stosowana. Magdalena Alama-Bućko. 25 marca Magdalena Alama-Bućko Wykład 4 25 marca / 25
Wykład 4 Informatyka Stosowana Magdalena Alama-Bućko 25 marca 2019 Magdalena Alama-Bućko Wykład 4 25 marca 2019 1 / 25 Macierze Magdalena Alama-Bućko Wykład 4 25 marca 2019 2 / 25 Macierza wymiaru m n
Bardziej szczegółowoPodstawy Programowania Podstawowa składnia języka C++
Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include
Bardziej szczegółowoAlgorytmy i struktury danych. Wykład 4
Wykład 4 Różne algorytmy - obliczenia 1. Obliczanie wartości wielomianu 2. Szybkie potęgowanie 3. Algorytm Euklidesa, liczby pierwsze, faktoryzacja liczby naturalnej 2017-11-24 Algorytmy i struktury danych
Bardziej szczegółowoProgramowanie komputerowe. Zajęcia 3
Programowanie komputerowe Zajęcia 3 Instrukcje przypisania Poza zwykłą instrukcją przypisania, powodującą ustawienie wartości zmiennej na podane wyrażenie, istnieje wiele innych, np. += dodaj, a+=b jest
Bardziej szczegółowoProgramowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44
Programowanie w C++ Wykład 2 Katarzyna Grzelak 4 marca 2019 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44 Na poprzednim wykładzie podstawy C++ Każdy program w C++ musi mieć funkcję o nazwie main Wcięcia
Bardziej szczegółowoTreść wykładu. Układy równań i ich macierze. Rząd macierzy. Twierdzenie Kroneckera-Capellego.
. Metoda eliminacji. Treść wykładu i ich macierze... . Metoda eliminacji. Ogólna postać układu Układ m równań liniowych o n niewiadomych x 1, x 2,..., x n : a 11 x 1 + a 12 x 2 + + a 1n x n = b 1 a 21
Bardziej szczegółowoWstęp do programowania
wykład 6 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2017/2018 Losowanie liczb całkowitych Dostępne biblioteki Najprostsze losowanie liczb całkowitych można wykonać za pomocą funkcji
Bardziej szczegółowo1 Macierz odwrotna metoda operacji elementarnych
W tej części skupimy się na macierzach kwadratowych. Zakładać będziemy, że A M(n, n) dla pewnego n N. Definicja 1. Niech A M(n, n). Wtedy macierzą odwrotną macierzy A (ozn. A 1 ) nazywamy taką macierz
Bardziej szczegółowoZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Bardziej szczegółowoPodstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.
Podstawowe elementy proceduralne w C++ Program i wyjście Zmienne i arytmetyka Wskaźniki i tablice Testy i pętle Funkcje Pierwszy program // Niezbędne zaklęcia przygotowawcze ;-) #include using
Bardziej szczegółowoRozwiązywanie układów równań liniowych metody dokładne Materiały pomocnicze do ćwiczeń z metod numerycznych
Rozwiązywanie układów równań liniowych metody dokładne Materiały pomocnicze do ćwiczeń z metod numerycznych Piotr Modliński Wydział Geodezji i Kartografii PW 13 stycznia 2012 P. Modliński, GiK PW Rozw.
Bardziej szczegółowoStrategia "dziel i zwyciężaj"
Strategia "dziel i zwyciężaj" W tej metodzie problem dzielony jest na kilka mniejszych podproblemów podobnych do początkowego problemu. Problemy te rozwiązywane są rekurencyjnie, a następnie rozwiązania
Bardziej szczegółowoZapis liczb binarnych ze znakiem
Zapis liczb binarnych ze znakiem W tej prezentacji: Zapis Znak-Moduł (ZM) Zapis uzupełnień do 1 (U1) Zapis uzupełnień do 2 (U2) Zapis Znak-Moduł (ZM) Koncepcyjnie zapis znak - moduł (w skrócie ZM - ang.
Bardziej szczegółowoWykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej
Wykład II - semestr II Kierunek Informatyka Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2015 c Copyright 2015 Janusz Słupik Operacje dyskowe - zapis do pliku #include #include
Bardziej szczegółowo1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE
1. Proste typy danych- ciąg dalszy 2. Typy złożone danych : TABLICE Wykład 3 ZMIENNE PROSTE: TYPY WBUDOWANE Typy zmiennoprzecinkowe: float double long double Różne rozmiary bajtowe. W konsekwencji różne
Bardziej szczegółowoI. Podstawy języka C powtórka
I. Podstawy języka C powtórka Zadanie 1. Utwórz zmienne a = 730 (typu int), b = 106 (typu long long), c = 123.45 (typu double) Wypisz następujące komunikaty: Dane sa liczby: a = 730, b = 106 i c = 123.45.
Bardziej szczegółowo