Wektory i macierze
- zmienne: skalary, wektory, macierze
- operacje wektorowe (wektoryzacja), operacje wykonywane na elementach macierzy bez konieczności używania pętli
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 odN
doM
z krokiem 1N:K:M
wartości odN
doM
z krokiemK
- funkcja
linspace(N, M, K)
- wektor zawierającyK
równoodległych punktów na odcinku odN
doM
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 macierzowev(i,j)
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 elementu1: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 zerowaones(n,m)
macierz zawierająca jedynkieye(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 100×100, 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 4×4
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)
od1
doend
- indeksowanie liniowe
(N)
od1
doend
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 macierzysize(m)
zwraca ilość wierszy i kolumnnumel(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 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