Wektory i macierze

zmienne: skalary, wektory, macierze

operacje wektorowe (wektoryzacja), operacje wykonywane na elementach macierzy bez konieczności używania pętli

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:Mwartoś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)

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 do 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

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 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) 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 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

Dla kolejnych od 2 do wykreśl z ciągu liczb wszystkie wielokrotności , czyli

Zwróć liczby, które nie zostały wykreślone

Wynik funkcji sito powinien być identyczny do wyniku funkcji Matlaba primes