Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:dydaktyka:ml:lab1 [2013/02/12 14:38]
esimon [Typy i zmienne]
pl:dydaktyka:ml:lab1 [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 +
 +
 +
 ====== Laboratorium 1 - Wprowadzenie do GNU Octave ====== ====== Laboratorium 1 - Wprowadzenie do GNU Octave ======
 Środowisko Octave jest wolnym odpowiednikiem pakietu MATLAB. Środowisko Octave jest wolnym odpowiednikiem pakietu MATLAB.
-===== Instalacja i uruchamianie ===== 
  
 +[[http://​www.gnu.org/​software/​octave/​doc/​interpreter/​index.html|Dokumentacja]]
 +===== Instalacja i uruchamianie =====
 + 
 W przypadku większości systemów Linux, pakiet Octave można zainstalować bezpośrednio z repozytorium:​ <​code>​$ sudo apt-get install octave</​code>​ W przypadku większości systemów Linux, pakiet Octave można zainstalować bezpośrednio z repozytorium:​ <​code>​$ sudo apt-get install octave</​code>​
  
Linia 14: Linia 19:
 W języku Octave, nie prototypujemy zmiennych. Typy określane są automatycznie,​ tak jak w PHP, czy Bashu. W języku Octave, nie prototypujemy zmiennych. Typy określane są automatycznie,​ tak jak w PHP, czy Bashu.
 <code octave>​zmienna = 'moja zmienna';​ <code octave>​zmienna = 'moja zmienna';​
-zmienna = 12.34;+zmienna = 12.34; ​
 zmienna = [2 3 4; 3 4 5];</​code>​ zmienna = [2 3 4; 3 4 5];</​code>​
  
Linia 29: Linia 34:
      ​\end{bmatrix}$$      ​\end{bmatrix}$$
            
-W Octave zapiszemy ją jako:<​code octave>M = [5 6 0; 6 0 1; 0 6 1]</​code>​+W Octave zapiszemy ją jako:<​code octave>M = [5 6 0; 6 0 1; 0 6 1] </​code>​
  
 Aby odwołać się do danego elementu macierzy, lub wektora używamy nawiasów okrągłych.\\ Aby odwołać się do danego elementu macierzy, lub wektora używamy nawiasów okrągłych.\\
 **Uwaga :!:** W Octave indeksowanie rozpoczyna się od 1 a nie jak w popularnych językach programowania od 0! Np. Aby pobrać/​przypisać wartość elementu z pierwszego wiersza i drugiej kolumny macierzy M, piszemy: **Uwaga :!:** W Octave indeksowanie rozpoczyna się od 1 a nie jak w popularnych językach programowania od 0! Np. Aby pobrać/​przypisać wartość elementu z pierwszego wiersza i drugiej kolumny macierzy M, piszemy:
-<code octave>​M(1,​2)=7</​code>​+<code octave>​M(1,​2)=7 </​code>​
  
 Jako wynik otrzymujemy:​ Jako wynik otrzymujemy:​
Linia 45: Linia 50:
 <code octave> <code octave>
 M(:,3) % zwróci [0;​1;​1] ​ M(:,3) % zwróci [0;​1;​1] ​
-M(2,:) % zwróci [6 0 1]+M(2,:) % zwróci [6 0 1]   
 +</​code>​ 
 + 
 + 
 +Sprawdź co jak zadziała poniższy kod: 
 +<code octave>​ 
 +M = [5 6 0; 6 0 1; 0 6 1]; 
 +M([2 3],[1 2]) 
 </​code>​ </​code>​
  
 ==== Zakresy ==== ==== Zakresy ====
-Octave pozwala na +Zakresy tworzy się za pomocą znaku dwukropka. Służą one do definiowania prostych zestawów danych, a  także do odwoływania się do danych w wektorach i macierzach. 
 + 
 +Przetestuj działanie poniższych poleceń 
 +<code octave>​zeros(1,​10) 
 +zeros(2,​10) 
 +ones(1,​10) 
 +range = [1:10]  
 +range = [1:0.3:10]  
 +range(5:​10) 
 +</​code>​ 
 + 
  
  
Linia 55: Linia 78:
 Octave udostępnia podstawowe operatory arytmetyczne zarówno dla macierzy jak i skalarów. Pełny zbiór operatorów dostępny jest w [[http://​www.gnu.org/​software/​octave/​doc/​interpreter/​Arithmetic-Ops.html#​Arithmetic-Ops|dokumentacji Octave]]. Octave udostępnia podstawowe operatory arytmetyczne zarówno dla macierzy jak i skalarów. Pełny zbiór operatorów dostępny jest w [[http://​www.gnu.org/​software/​octave/​doc/​interpreter/​Arithmetic-Ops.html#​Arithmetic-Ops|dokumentacji Octave]].
  
-**Uwaga :!:** Zwróć uwagę na działanie operatorów połączonych z kropką!+**Uwaga :!:** Zwróć uwagę na działanie operatorów połączonych z kropką! ​\\ 
 +Przetestuj działanie poniższego kodu. 
 +<code octave>​ 
 +A = [0.5 0.5; 1 1]; 
 +B = [2 2; 2 2]; 
 +  
 +A * B 
 +A .* B 
 +B ^ 2 
 +B .^ D 
 +</​code>​
  
  
Linia 76: Linia 109:
 function W = srednia(dane) function W = srednia(dane)
     % funkcja obliczająca średnią elementów w wektorze     % funkcja obliczająca średnią elementów w wektorze
-    W = sum(dane)/​length(dane);​+    W = sum(dane)/​length(dane); ​ 
 +end
 </​file>​ </​file>​
  
 Aby wywołać funkcje z przykładu powyżej wykonujemy polecenie: Aby wywołać funkcje z przykładu powyżej wykonujemy polecenie:
-<code octave>​Wynik = srednia([2 3 4 5 6 7 8]);</​code>​+<code octave>​Wynik = srednia([2 3 4 5 6 7 8]); </​code>​ 
 + 
 +Jeśli funkcja ma zwracać więcej niż jeden argument, zapisujemy to w ten sposób: 
 +<file octave myFind.m>​ 
 +function [IndexX,​IndexY] = myFind(M,​V) 
 +   % Funkcja poszukująca wartości V w macierzy M 
 +   % Funkcja zwraca indeksy znalezionej wartości, lub -1,-1 
 +   ​[rows,​cols] = size(M); 
 +   ​IndexX = IndexY =-1;  
 +   for i=1:rows, 
 +     for j=1:cols 
 +       if M(i,j) == V 
 +         ​IndexX = i; 
 +         ​IndexY = j; 
 +         ​return;​ 
 +       ​endif 
 +     end 
 +   end 
 +end 
 +</​file>​ 
 + 
 +Aby pobrać wartości zwracane przez funkcję powyżej wpisujemy np.: 
 +<code octave>​ 
 +[X,Y] = myFind(M,​6); ​  
 +</​code>​ 
 + 
 +==== Rysowanie wykresów ==== 
 +Do rysowania wykresów używamy funkcji:  
 +  * plot - rysowanie wykresów 2D 
 +  * plot3d - rysowanie wykresów 3D 
 +  * mesh - rysowanie płaszczyzn  
 + 
 +Porównaj działanie funkcji na poniższych przykładach. Jaka jest różnica pomiędzy plot3 a mesh? 
 + 
 +**Plot2** 
 +<code octave>​ 
 +x = [0:​0.01:​10];​  
 +y = sin(x); 
 +plot(x,​y);​ 
 +</​code>​ 
 + 
 +**Plot3** 
 +<code octave>​ 
 +t = 0:​0.1:​10*pi;​ 
 +r = linspace (0, 1, numel (t));  
 +z = linspace (0, 1, numel (t)); 
 +plot3 (r.*sin(t), r.*cos(t), z); 
 +</​code>​ 
 + 
 +**Mesh** 
 +<code octave>​ 
 +tx = ty = linspace (-8, 8, 41)';​ 
 +[xx, yy] = meshgrid (tx, ty); 
 +r = sqrt (xx .^ 2 + yy .^ 2) + eps; 
 +tz = sin (r) ./ r;  
 +mesh (tx, ty, tz); 
 +</​code>​ 
  
 ===== Dobre praktyki ===== ===== Dobre praktyki =====
   * Jeśli tylko jest to możliwe, używaj funkcji wbudowanych. Na przykład zamiast pisać swoją własną funkcję **srednia** lepiej było wykorzystać wbudowaną funkcję **mean**.   * Jeśli tylko jest to możliwe, używaj funkcji wbudowanych. Na przykład zamiast pisać swoją własną funkcję **srednia** lepiej było wykorzystać wbudowaną funkcję **mean**.
   * Jeśli to tylko możliwe, staraj się wykorzystywać operacje na macierzach, zamiast pętli. ​   * Jeśli to tylko możliwe, staraj się wykorzystywać operacje na macierzach, zamiast pętli. ​
 +  * Zawsze definiuj wcześniej wektor/​macierz z która pracujesz (chyba że jest ona bezpośrednim wynikiem jakichś operacji). Np.:<​code octave>M = zeros(3,​3);​ 
 +[x,y] = size(M); 
 +for i=1:x 
 +  for j=1:y 
 +    M(i,j) = rand; 
 +  end  
 +end</​code>​
  
 ===== Ćwiczenia ===== ===== Ćwiczenia =====
-==== Operacje podstawowe ====+==== Operacje podstawowe ​I====
 Zakładając,​ że mamy następującą macierz Zakładając,​ że mamy następującą macierz
 $$A = \begin{bmatrix} $$A = \begin{bmatrix}
Linia 104: Linia 201:
        4 & 14         4 & 14 
      ​\end{bmatrix}$$      ​\end{bmatrix}$$
 +     
 +    ​
 +==== Operacje podstawowe II==== ​
 +Napisz funkcję znajdującą najmniejszy i największy element w macierzy i zwracającą te wartości.
 +
 +**Podpowiedź** użyj zbudowanych funkcji //min// i //max//.
 ==== Wartość wektora ==== ==== Wartość wektora ====
 Napisz funkcje wyznaczającą długość (normę) wektora podanego jako parametr, która określona jest wzorem: Napisz funkcje wyznaczającą długość (normę) wektora podanego jako parametr, która określona jest wzorem:
Linia 111: Linia 214:
 $$\sigma = \sqrt{\frac{\sum\limits_{i=1}^{N} $$\sigma = \sqrt{\frac{\sum\limits_{i=1}^{N}
   \left(x_{i} - \mu)^{2}}   \left(x_{i} - \mu)^{2}}
-  N}$$+  ​{N-1}}$$
   ​   ​
-Gdzie $\mu$ to średnia, a N to liczba wszystkich elementów.+Gdzie $\mu$ to średnia, a N to liczba wszystkich elementów ​w probie.
  
 ==== Odchylenie standardowe II==== ==== Odchylenie standardowe II====
 Przyjmij, że tym razem parametrem funkcji nie jest wektor, ale macierz. Funkcja powinna obliczyć odchylenia standardowe dla każdego wiersza macierzy osobno i zwrócić wektor odchylen standardowych. ​ Przyjmij, że tym razem parametrem funkcji nie jest wektor, ale macierz. Funkcja powinna obliczyć odchylenia standardowe dla każdego wiersza macierzy osobno i zwrócić wektor odchylen standardowych. ​
  
-**Uwaga** Pamiętaj o zadaniu [[#Operacje_podstawowe|Operacje Podstawowe]]!+**Uwaga** Pamiętaj o zadaniu [[#Operacje_podstawowe_i|Operacje Podstawowe ​I i II]]!
 ==== Wydajność I==== ==== Wydajność I====
 Dla funkcji napisanych w poprzednich dwóch zadaniach ([[#​dlugosc_wektora|Długość wektora]] oraz [[#​odchylenie_standardowe_i|Odchylenie Standardowe I]]) dopisz ich odpowiedniki wektorowe (lub z użyciem pętli) i przetestuj ich działanie na wygenerowanym losowo zbiorze $10^6$ liczb. Dla funkcji napisanych w poprzednich dwóch zadaniach ([[#​dlugosc_wektora|Długość wektora]] oraz [[#​odchylenie_standardowe_i|Odchylenie Standardowe I]]) dopisz ich odpowiedniki wektorowe (lub z użyciem pętli) i przetestuj ich działanie na wygenerowanym losowo zbiorze $10^6$ liczb.
  
-Aby wygenerować dane użyj:<​code octave> data = rand(1,​10^6);</​code>​+Aby wygenerować dane użyj:<​code octave> data = rand(1,​10^6);​ </​code>​
  
 Porównaj czasy wykonywania funkcji: Porównaj czasy wykonywania funkcji:
Linia 128: Linia 231:
 timestart = time(); timestart = time();
  
-%Wywolanie funkcji+%Wywolanie funkcji ​
  
 timestop = time(); timestop = time();
  
-printf('​Czas wykonania to %d sekund.\n',​(timestop-stimestart));+printf('​Czas wykonania to %d sekund.\n',​(timestop-timestart));
 </​code>​ </​code>​
  
Linia 144: Linia 247:
 <code octave>A = zeros(10,​10) <code octave>A = zeros(10,​10)
 v = zeros(10, 1); v = zeros(10, 1);
 +x = zeros(10, 1);
 for i = 1:10 for i = 1:10
   for j = 1:10    for j = 1:10 
-    ​v(i) = v(i) + A(i, j) * x(j);+    ​x(i) = v(i) + A(i, j) * v(j); 
   end   end
 end end
Linia 155: Linia 259:
 for i = 1:7 for i = 1:7
   for j = 1:7   for j = 1:7
-    A(i, j) = log (X(i, j));+    A(i, j) = log (X(i, j)); 
     B(i, j) = X(i, j) ^ 2;     B(i, j) = X(i, j) ^ 2;
     C(i, j) = X(i, j) + 1;     C(i, j) = X(i, j) + 1;
Linia 164: Linia 268:
 ==== Rysowanie wykresu funkcji ==== ==== Rysowanie wykresu funkcji ====
  
-Napisz funkcję która będzie wyznaczała wartości funkcji z obrazka poniżej. Wyrysuj wartości tej funkcji na wykresie w przedziale od -10 do 10.+Napisz funkcję która będzie wyznaczała wartości funkcji z obrazka poniżej. Wyrysuj wartości tej funkcji na wykresie w przedziale od -10 do 10 z krokiem 0.5. 
 + 
 +{{:​pl:​dydaktyka:​ml:​absfun.png|Wartość bezwzględna}}
  
-{{:​pl:​dydaktyka:​ml:​prv:​absfun.png|Wartość bezwzględna}} 
  
pl/dydaktyka/ml/lab1.1360676331.txt.gz · ostatnio zmienione: 2019/06/27 15:54 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0