====== Wektory i macierze ====== * zmienne: skalary, wektory, macierze * operacje wektorowe (wektoryzacja), operacje wykonywane na elementach macierzy bez konieczności używania pętli {{zajecia:pp2_2020_2:skalar_wektor_macierz.png| image.png}} s = 5 % skalar v1 = [5, 88, 3, 11] % wektor "wierszowy" v2 = [3; 7; 4] % wektor "kolumnowy" m = [9 6 3; 5 7 2] % macierz whos s = 5 v1 = 5 88 3 11 v2 = 3 7 4 m = 9 6 3 5 7 2 Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== ans 1x5 5 char m 2x3 48 double s 1x1 8 double v1 1x4 32 double v2 3x1 24 double Total is 19 elements using 117 bytes ===== Tworzenie wektorów ===== * operator ''%%:%%'' * ''%%N:M%%''wartości od ''%%N%%'' do ''%%M%%'' z krokiem 1 * ''%%N:K:M%%'' wartości od ''%%N%%'' do ''%%M%%'' z krokiem ''%%K%%'' * funkcja ''%%linspace(N, M, K)%%'' - wektor zawierający ''%%K%%'' równoodległych punktów na odcinku od ''%%N%%'' do ''%%M%%'' v1 = 1:4 v2 = 1:0.5:4 v3 = linspace(1, 2, 5) v1 = 1 2 3 4 v2 = 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000 4.0000 v3 = 1.0000 1.2500 1.5000 1.7500 2.0000 **Ćwiczenie**: za pomocą operatora ''%%:%%'' wygeneruj wektor ''%%[9 7 5 3 1]%%'' ===== Dostęp do elementów wektora ===== * elementy indeksowane od ''%%1%%'' za pomocą operatora ''%%()%%'' * indeksowanie liniowe ''%%v(i)%%'' lub macierzowe ''%%v(i,j)%%'' {{zajecia:pp2_2020_2:wektor.png| image.png}} v = -5:5 a = v(1) b = v(2) c = v(1:3) % indeksowanie zakresem ind = 1:2:10 d = v(ind) % indeksowanie innym wektorem zawierającym indeksy v = -5 -4 -3 -2 -1 0 1 2 3 4 5 a = -5 b = -4 c = -5 -4 -3 ind = 1 3 5 7 9 d = -5 -3 -1 1 3 * ''%%end%%'' oznacza indeks ostatniego elementu * ''%%1:end%%'' indeksy wszystkich elementów * ''%%(:)%%'' wszystkie elementy (uwaga: wektor wierszowy będzie wypisany jako kolumnowy) v(end) ; % ostatni element v(1:end); v(:) ; % wszystkie elementy **Ćwiczenie** stwórz wektor ''%%x%%'' zawierający 100 kolejnych wartości z przedziału od $-\pi$ do $\pi$ a następnie wypisz jego elementy w losowej kolejności. Do przetasowania kolejności elementów wykorzystaj funkcję ''%%randperm%%''. % modyfikowanie elementów v(1) = 42; v v = 42 -4 -3 -2 -1 0 1 2 3 4 5 % modyfikowanie zakresu wartości v([1 3 end]) = 222 v(4:7) = 333 v(1:3) = [ -100 -200 -300] v(:) = v(end:-1:1) v = 222 -4 222 -2 -1 0 1 2 3 4 222 v = 222 -4 222 333 333 333 333 2 3 4 222 v = -100 -200 -300 333 333 333 333 2 3 4 222 v = 222 4 3 2 333 333 333 333 -300 -200 -100 **Ćwiczenie**: Utwórz wektor zawierający 100 liczb zgodnie z sekwencją ''%%[1 -2 3 -4 5 ... 99 -100]%%'' * wstawienie elementu poza zakresem spowoduje rozszerzenie wektora * brakujące elementy wypełnione zerami * rozszerzenie nieefektywne - zalecane jest wstępne alokowanie wektora/macierzy o docelowym rozmiarze # referencja do elementu poza zakresem v = [1 2 3] v(10) = 5; v v = 1 2 3 v = 1 2 3 0 0 0 0 0 0 5 v1 = zeros([1, 10]); v1(1:3) = 1:3; v1(10) = 5 v1 = 1 2 3 0 0 0 0 0 0 5 ===== Usuwanie elementów wektora ===== w = 1:12 w(1) = [] % usuwanie wybranego elementu w([3 6]) = [] % usuwanie zakresu elementów w(6:end) = [] w = 1 2 3 4 5 6 7 8 9 10 11 12 w = 2 3 4 5 6 7 8 9 10 11 12 w = 2 3 5 6 8 9 10 11 12 w = 2 3 5 6 8 ===== Transpozycja ===== * operator ''%%'%%'' realizuje transpozycję wektora (macierzy) v = 1:5; v2 = v' v2(2) = 42; v2 v2 = 1 2 3 4 5 v2 = 1 42 3 4 5 ===== Łączenie wektorów ===== * ''%%[A B]%%'' łączenie poziome (rozszerzanie wiersza) * ''%%[A; B]%%'' łączenie pionowe (rozszerzenie kolumny) v1 = 1:3; v2 = 101:103; a = [v1 v2 ] % sklejanie wierszy b = [v1' v2'] a = 1 2 3 101 102 103 b = 1 101 2 102 3 103 c = [v1 ; v2 ] % rozszerzenie kolumn d = [v1'; v2'] c = 1 2 3 101 102 103 d = 1 2 3 101 102 103 **Ćwiczenie**: utwórz wektor zawierający elementy ułożone wg. schematu\\ ''%%[1 2 3 ... 99 100 100 99 ... 3 2 1]%%'' ===== Macierze ===== * macierze również mozna tworzyć za pomoca operatora ''%%:%%'' * ilość elementów w wierszach musi być jednakowa m1 = [1 2 3; 4 5 6] m2 = [5:8 ; 10:13] m1 = 1 2 3 4 5 6 m2 = 5 6 7 8 10 11 12 13 ===== Funkcje tworzące macierze ===== * ''%%rand(n,m)%%'' losowe wartość z przedziału $[0, 1]$ * ''%%zeros(n,m)%%'' macierz zerowa * ''%%ones(n,m)%%'' macierz zawierająca jedynki * ''%%eye(n,m)%%'' macierz jednostkowa (jedynki na diagonali) a = rand(3) b = rand(3, 2) a = 0.98035 0.74939 0.90313 0.19552 0.26712 0.95655 0.84169 0.11774 0.16030 b = 0.27733 0.69148 0.52666 0.17304 0.49385 0.34990 c = zeros(5) d = ones(2,5) c = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d = 1 1 1 1 1 1 1 1 1 1 e = eye(4) e = Diagonal Matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 **Ćwiczenie** utwórz macierz o wymiarach 100x100, która posiada wartości 1 w pierwszej i czwartej ćwiartce oraz wartości 0 w pozostałych miejscach, zgodnie z poniższym przykładem macierzy 4x4\\ ''%%1 1 0 0 1 1 0 0 0 0 1 1 0 0 1 1%%'' ===== Indeksowanie macierzy ===== * indeksowanie 2 wymiarów macierzy ''%%(N,M)%%'' od ''%%1%%'' do ''%%end%%'' * indeksowanie liniowe ''%%(N)%%'' od ''%%1%%'' do ''%%end%%'' po elementach kolejnych kolumn m = [1, 2, 3; 4, 5, 6] a = m(1,2) b = m(1:2, 1:2) c = m(:, 1) % cała kolumna d = m(end, :) % cały wiersz m = 1 2 3 4 5 6 a = 2 b = 1 2 4 5 c = 1 4 d = 4 5 6 % indeksowanie liniowe a = m(1) b = m(end) c = m(1:end) a = 1 b = 6 c = 1 4 2 5 3 6 ===== Rozmiary wektorów i macierzy ===== * ''%%length(w)%%'' ilość elementów wektora lub najdłuższy wymiar macierzy * ''%%size(m)%%'' zwraca ilość wierszy i kolumn * ''%%numel(m)%%'' ilość elementów w = 1:100; a = length(w) b = size(w) c = numel(w) a = 100 b = 1 100 c = 100 m = rand(13, 100); a = length(m) b = size(m) c = numel(m) a = 100 b = 13 100 c = 1300 **Ćwiczene** napisz funkcję ''%%suma%%'', która wyznaczy sumę wszystkich elementów macierzy podanej w argumencie. Ćwiczenie wykonaj z użyciem instrukcji pętli, iterując po wszystkich elementach macierzy. W jaki sposób osiągnąć to samo za pomocą wunkcji ''%%sum%%''? ===== Zadanie 4 ===== Zaimplementuj funkcję o nazwie ''%%sito%%'', która korzystając z algorytmu [[https://pl.wikipedia.org/wiki/Sito_Eratostenesa|sita Eratostenesa]] utworzy wektor zawierający serię liczb pierwszych od 2 do ''%%N%%'', gdzie wartość ''%%N%%'' jest jedynym argumentem funkcji. W przypadku braku podania argumentu domyślnie będzie użyta wartość ''%%N=100%%''. - Utwórz ciąg liczb od 2 do $n$ - Dla kolejnych $i$ od 2 do $\sqrt{n}$ wykreśl z ciągu liczb wszystkie wielokrotności $i$, czyli $i, 2i, 3i, \ldots$ - Zwróć liczby, które nie zostały wykreślone Wynik funkcji ''%%sito%%'' powinien być identyczny do wyniku funkcji Matlaba ''%%primes%%''