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
  • 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]

  • 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 $-\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
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
  • 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
  • [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 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
  • 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 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 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
  • 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?

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.

  1. Utwórz ciąg liczb od 2 do $n$
  2. Dla kolejnych $i$ od 2 do $\sqrt{n}$ wykreśl z ciągu liczb wszystkie wielokrotności $i$, czyli $i, 2i, 3i, \ldots$
  3. Zwróć liczby, które nie zostały wykreślone

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