====== 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%%''