To jest stara wersja strony!


Laboratorium 1 - Wprowadzenie do GNU Octave

Środowisko Octave jest wolnym odpowiednikiem pakietu MATLAB.

Instalacja i uruchamianie

W przypadku większości systemów Linux, pakiet Octave można zainstalować bezpośrednio z repozytorium:

$ sudo apt-get install octave

W przypadku systemu Windows i OS X, oprogramowanie Octave można ściągnąć ze strony projektu: GNU Octave.

W systemie Linux uruchamiamy środowisko za pomocą polecenia

$ octave

W konsoli Octave możemy wykonywać wszystkie podstawowe polecenia umożliwiające nawigację w systemie plików (cd, ls, etc).

Składnia

Typy i zmienne

W języku Octave, nie prototypujemy zmiennych. Typy określane są automatycznie, tak jak w PHP, czy Bashu.

zmienna = 'moja zmienna';
zmienna = 12.34;
zmienna = [2 3 4; 3 4 5];

Jednym z podstawowych typów danych w Octave są wektory i macierze. Definiujemy je za pomocą nawiasów kwadratowych. Wartości w wierszach oddzielamy spacjami lub przecinkami. Wiersze oddzielamy znakiem średnika.

Załóżmy że chcemy zdefiniować następującą macierz i przypisać ją do zmiennej M:

$$M = \begin{bmatrix}
       5 & 6 & 0 \\          
       6 & 0 & 1 \\
       0 & 6 & 1
     \end{bmatrix}$$

W Octave zapiszemy ją jako:

M = [5 6 0; 6 0 1; 0 6 1]

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:

M(1,2)=7

Jako wynik otrzymujemy:

$$M = \begin{bmatrix}
       5 & 7 & 0 \\          
       6 & 0 & 1 \\
       0 & 6 & 1
     \end{bmatrix}$$

Octave umozliwia równiez odwoływanie się do całych kolumn i wierszy w danej macierzy:

M(:,3) % zwróci [0;1;1] 
M(2,:) % zwróci [6 0 1]

Sprawdź co jak zadziała poniższy kod:

M = [5 6 0; 6 0 1; 0 6 1];
M([2 3],[1 2])

Zakresy

Octave pozwala na bardziej zaawansowane odwoływanie się do danych zebranych np. w macierzach, lub wektorach. Zakresy tworzy się za pomocą znaku dwukropka. Przetestuj działanie poniższych poleceń

range = [1:100]
range = [1:0.3:100] 
range(5:10)

Operatory arytmetyczne

Octave udostępnia podstawowe operatory arytmetyczne zarówno dla macierzy jak i skalarów. Pełny zbiór operatorów dostępny jest w dokumentacji Octave.

Uwaga :!: Zwróć uwagę na działanie operatorów połączonych z kropką!

Instrukcje sterujące

Octave udostępnia powszechnie znane z innych języków programowania instrukcje sterujące. Pełny opis instrukcji sterujących można znaleźć w dokumentacji Octave

Definiowanie funkcji

Szczegółowe dane na temat definiowania funkcji można znaleźć w dokumentacji Octave. Poniżej kilka podstawowych infromacji:

  • Funkcje najczęściej definiujemy w osobnych plikach z rozszerzeniem .m
  • Nazwa funkcji musi zgadzać się z nazwą pliku!
  • Wywoływanie funkcji odbywa się poprzez podanie jej nazwy i listy argumentów.
  • Podczas wywoływania funkcji musimy znajdować się w katalogu w którym dana funkcja jest zapisana.
  • W Octave nie zwracamy wartości za pomocą return. Po prostu przypisujemy ją do zmiennej podanej jako element zwracany
  • Komentarze w kodzie wstawiamy za pomocą %

Przykładowa definicja funkcji:

srednia.m
function W = srednia(dane)
    % funkcja obliczająca średnią elementów w wektorze
    W = sum(dane)/length(dane);

Aby wywołać funkcje z przykładu powyżej wykonujemy polecenie:

Wynik = srednia([2 3 4 5 6 7 8]);

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 to tylko możliwe, staraj się wykorzystywać operacje na macierzach, zamiast pętli.

Ćwiczenia

Operacje podstawowe

Zakładając, że mamy następującą macierz

$$A = \begin{bmatrix}
       16 & 2 & 3 & 13 \\
       5 & 11& 10 & 8 \\
       9 & 7 & 6 & 12 \\
       4 & 14 & 15 & 1
     \end{bmatrix}$$

Jakie indeksowanie macierzy A pozwoli na wyciągnięcie z niej następującej macierzy:

$$B = \begin{bmatrix}
       16 & 2  \\
       5 & 11 \\
       9 & 7  \\
       4 & 14 
     \end{bmatrix}$$

Wartość wektora

Napisz funkcje wyznaczającą długość (normę) wektora podanego jako parametr, która określona jest wzorem:

$$|A| = \sqrt{\sum\limits_{i=1}^n a_i^2} $$

Odchylenie standardowe I

Napisz funkcję wyznaczającą odchylenie standardowe dla wartości wektora podanego jako parametr. Odchylenie standardowe dane jest wzorem:

$$\sigma = \sqrt{\frac{\sum\limits_{i=1}^{N}
  \left(x_{i} - \mu)^{2}}
  N}$$

Gdzie $\mu$ to średnia, a N to liczba wszystkich elementów.

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.

Uwaga Pamiętaj o zadaniu Operacje Podstawowe!

Wydajność I

Dla funkcji napisanych w poprzednich dwóch zadaniach (Długość wektora oraz 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:

 data = rand(1,10^6);

Porównaj czasy wykonywania funkcji:

timestart = time();
 
%Wywolanie funkcji
 
timestop = time();
 
printf('Czas wykonania to %d sekund.\n',(timestop-stimestart));

Jak zmienią się czasy gdy zmienimy ilość danych z $10^6$ na $10^8$? O ile wolniej (procentowo) wykonuje się algorytm wyznaczający odchylenie standardowe wykorzystujący wbudowaną funkcję obliczającą średnią od tego, który wykorzystuje funkcję srednia napisaną przez nas?

Wydajność II

Jak poprawic wydajnośc następujących fragmentów kodu:

Przykład I

A = zeros(10,10)
v = zeros(10, 1);
for i = 1:10
  for j = 1:10 
    v(i) = v(i) + A(i, j) * x(j);
  end
end

Przykład II

for i = 1:7
  for j = 1:7
    A(i, j) = log (X(i, j));
    B(i, j) = X(i, j) ^ 2;
    C(i, j) = X(i, j) + 1;
    D(i, j) = X(i, j) / 4;
  end
end

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.

Wartość bezwzględna

pl/dydaktyka/ml/lab1.1360678423.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