Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:ml:lab1 [2013/02/12 15:25] esimon [Dobre praktyki] |
pl:dydaktyka:ml:lab1 [2019/06/27 15:50] (aktualna) |
| |
| |
| |
====== 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> |
| |
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> |
| |
\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: |
<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> | </code> |
| |
<code octave> | <code octave> |
M = [5 6 0; 6 0 1; 0 6 1]; | M = [5 6 0; 6 0 1; 0 6 1]; |
M([2 3],[1 2]) | M([2 3],[1 2]) |
</code> | </code> |
| |
zeros(2,10) | zeros(2,10) |
ones(1,10) | ones(1,10) |
range = [1:10] | range = [1:10] |
range = [1:0.3:10] | range = [1:0.3:10] |
range(5:10) | range(5:10) |
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> |
| |
| |
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 ===== |
for j=1:y | for j=1:y |
M(i,j) = rand; | M(i,j) = rand; |
end | end |
end</code> | 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} |
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: |
$$\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: |
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> |
| |
<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 |
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; |
==== 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}} | |
| |