MATLAB Tutorial #3

Działanie funkcji na wektorach

W MATLABie większość funkcji obliczeniowych i graficznych możemy wywoływać na wektorach oraz macierzach. W niektórych przypadkach wymiar macierzy będącej argumentem wejściowym funkcji nie ma większego znaczenia, gdyż funkcje mogą traktować macierz jako zbiór niezależnych elementów, gdzie obliczenia wywoływane są dla każdego elementu niezależnie. Na przykład działają tak funkcje trygonometryczne.

x = sin(ogolem1991)

Oczywiście sens powyższej operacji jest mocno dyskusyjny 🙂 W każdym razie, w przypadku funkcji sinus wynik został wyznaczony niezależnie dla każdego elementu macierzy ogolem1991. Nieco inaczej sprawa wygląda, gdy dla danych uruchomimy funkcję typu diff lub jedną z funkcji statystycznych. Tutaj wymiar ma znaczenie. Zacznijmy od prostszego przypadku, czyli od pracy z wektorem.

  • Wyznacz średnią ilość mieszkań spółdzielczych oddawanych do użytku miesięcznie w roku 1991
spoldzielcze1991M = diff(spoldzielcze1991);
spoldzielcze1991M = [spoldzielcze1991(1) spoldzielcze1991M];
x = mean(spoldzielcze1991M)

x =

6.9628e+03

Funkcja mean wyznaczyła wartość średnią dla wszystkich danych zebranych w wektorze spoldzielcze1991M. MATLAB przedstawił wynik w specyficznym formacie "naukowym". 6.9628e+03 oznacza 6.9628 * 1000.

Format wyświetlania danych w MATLABie

Jak więc wyświetlić wynik w nieco bardziej czytelny sposób?

  • Wykorzystaj polecenie format do zmiany formaty wyświetlanych danych.
format shortG
x

x =

6962.8

Idea stojąca za domyślnym sposobem wyświetlania wyników w MATLABie jest całkiem sensowna. Chodzi o ty, by pokazać rząd wielkości (10^3) i kilka pierwszych znaczących cyfr wyniku. Nie dla każdych danych jest to jednak trafione rozwiązanie, dotyczy to choćby  naszego przypadku. Aby powrócić do domyślnego sposobu prezentacji danych należy w linii poleceń wpisać:

format short

Muszę jeszcze podkreślić jedną rzecz - zmieniając format wyświetlania danych nie wpływamy w żaden sposób na dokładność zapisu tych danych w pamięci operacyjnej. Zmienia się jedynie to, w jaki sposób wyniki są nam wyświetlane. Domyślnie w MATLABie wszystkie dane zapisywane są jako double.

Zakończę tą małą dygresję i powracam do głównego tematu, czyli do wywoływania funkcji obliczeniowych MATLABa na macierzach.

Działanie funkcji na macierzach

W celu lepszego zobrazowania tematu zacznijmy od stworzenia w workspace prostej, pomocniczej macierzy M.

  • Stwórz w MATLAB poniższą macierz M

M = \begin{bmatrix} 2&-2&3\\8&2&-5\\4&1&1\end{bmatrix}

M = [2 -2 3; 8 2 -5; 4 1 1]

M =


2 -2 3
8 2 -5
4 1 1

Dla każdego elementu macierzy M możemy teraz wyznaczyć wartość funkcji sinus:

x = sin(M)

Możemy również dla całej macierzy obliczyć wyznacznik:

x = det(M)

x =

70

Co się jednak stanie, gdy na macierzy uruchomimy jedną z funkcji statystycznych lub funkcję diff? Zacznijmy od funkcji statystycznych.

  • Wywołaj funkcję max jako argument wejściowy podając macierz M
x = max(M)

x =

8 2 3

W pierwszej chwili można poczuć się zdezorientowanym - pytasz o wartość maksymalną, a MATLAB przedstawia 3 wyniki. Czyżby można było sobie wybrać jedną z trzech propozycji? Wystarczy bliżej przyglądnąć się liczbom zebranym w macierzy M, by złapać o co chodzi. MATLAB przedstawił wartości maksymalne osobno dla każdej z kolumn macierzy M. Kiedy funkcję obliczeniową lub graficzną wywołujemy dla macierzy, MATLAB traktuje tę macierz najczęściej jako zbiór zmiennych, zgodnie z zasadą: każda kolumna to osobna zmienna. Tak działa to dla szeregu funkcji statystycznych (np. min, max, std, var, mean), w przypadku funkcji diff, ale  również  dla funkcji graficznych wyświetlających wyniki. Prezentując  wcześniej wykresy z pomocą funkcji bar, jako argument wejściowy podaliśmy jedną macierz z tym, że sklejoną "na gorąco" z dwóch wektorów. Dla przypomnienia, wyglądało to tak:

bar([spoldzielcze1991' spoldzielcze2001])

Budownictwo spółdzielcze 1991 vs 2001
Zobaczmy więc w praktyce, jak działa funkcja diff wywołana dla macierzy:

  • Uruchom funkcję diff na macierzy M.
dM = diff(M)


dM =

6 4 -8
-4 -1 6

Wynik jest zrozumiały, jeśli tylko spojrzymy na wejściową macierz M. 8 - 2 = 6, 2 - (-2) = 4 itd. Moglibyśmy uruchomić teraz funkcję diff w podobny sposób na macierzy BMdane zawierającej dane dotyczące budownictwa, ale wynik operacji nie byłby specjalnie przydatny. Jak już wspomniałem, domyślny sposób działania tej funkcji i większości funkcji w MATLABie jest taki, że działają one na kolumnach macierzy.  W przypadku funkcji diff otrzymujemy wynik odejmowania zawartości wiersza 1 od wiersza 2 macierzy, wiersza 2 od wiersza 3 itd. Nas interesuje jednak różnica pomiędzy poszczególnymi kolumnami. Jak uzyskać odpowiedni efekt? Jeśli wiemy jakiej funkcji chcemy użyć, a nie wiemy jak, najlepiej przejść do dokumentacji dla tej konkretnej funkcji.

  • Otwórz dokumentację MATLABa dla funkcji diff.
doc diff

docdiff

Dokumentacja podzielona jest na kilka sekcji. W pierwszej z nich możemy zapoznać się ze sposobami wywoływania funkcji, następnie mamy szczegółowy opis działania (dla różnych wariantów wywołania), trzecia sekcja to przykłady zastosowania. Jeśli chcemy zobaczyć jak kod umieszczony w przykładzie działa w praktyce, należy go zaznaczyć, a następnie kliknąć prawym przyciskiem myszy i z menu kontekstowego wybrać opcję Evaluate Selection. Jak widzimy, funkcja diff może przyjąć aż trzy argumenty wejściowe. Pierwszy to macierz, drugi to stopień wyznaczania różnicy (podając 1 wyznaczamy różnicę, podając 2 wyznaczmy różnicę z różnicy), trzeci argument określa po jakim wymiarze liczona jest różnica. My chcemy obliczyć różnice dla kolumn, więc ten argument przyjmuje w naszym przypadku wartość 2. (Taką przyjęto konwencję. Jeśli funkcją diff chcemy wyznaczyć różnice pomiędzy kolumnami, musimy podać trzeci argument, którego wartość wynosi 2. Koniec, kropka).

  • Wywołaj funkcję diff na macierzy M podając dodatkowy argument wskazujący, że chcesz wyznaczyć drugą różnicę.
  • Wywołaj funkcję diff dla macierzy M licząc pierwszą różnicę ale po kolumnach.
dM2 = diff(M,2)
dMc = diff(M,1,2)

Możemy zostawić macierze pomocnicze i przejść do działania na naszych danych związanych z budownictwem mieszkaniowym w Polsce.

  • Wywołaj teraz funkcję diff dla macierzy BMdane licząc różnice „po kolumnach”.
BMdaneM = diff(BMdane,1,2)

Otrzymałeś w wyniku macierz, w której „brakuje” pierwszej kolumny – z informacją dotyczącą stycznia. Możesz tę informację teraz wybrać z macierzy BMdane. Do macierzy BMdaneM „doklej” z lewej strony pierwszą kolumnę z macierzy BMdane.

  • Wpisz w wierszu poleceń:
BMdaneM = [BMdane(:,1) BMdaneM];

Przypomnijmy jeszcze, że nawiasy kwadratowe [] oznaczają, że tworzona jest macierz. BMdane(:,1) to wskazanie wszystkich wierszy, (dwukropek), pierwszej kolumny macierzy BMdane. Przy okazji,  jeśli tworzone macierze są znacznych rozmiarów, wyświetlanie ich w oknie poleceń MATLABa nic nie wnosi, a jedynie tworzy niepotrzebny nieład. Jeśli polecenie zakończymy znakiem średnika(;), wynik operacji nie będzie się wyświetlał bezpośrednio w Command Window, natomiast pojawi się w Workspace.

Zapis zmiennych do pliku

W przestrzeni roboczej masz teraz dużą liczbę zmiennych i z całą pewnością nie wszystkie będą potrzebne do dalszej pracy. Zmienne można usuwać  w oknie Workspace lub w Command Window wywołując polecenie clear.  Wpisz w linii poleceń:

clear ogolem1991 ogolem2001

Zauważ, że z okna Workspace zniknęły wskazane zmienne. Tak naprawdę, to chcesz pozbyć się z przestrzeni roboczej prawie wszystkich zmiennych, więc podejdziemy do problemu nieco inaczej. Najpierw zapisz do pliku bud.mat dane, które będą nam jeszcze potrzebne:

save bud BMdane BMdaneM

Polecenie utworzyło w katalogu roboczym plik bud.mat, do którego zostały zapisane zmienne BMdane i BMdaneM. Gdyby wywołać polecenie save podając jedynie nazwę pliku, zapisałyby się do niego wszystkie zmienne. Możesz teraz wyczyścić całą przestrzeń roboczą przy pomocy polecenia clear. Wpisz w command window:

clear

Wszystkie zmienne widoczne wcześniej w Workspace zniknęły. Jeśli prawidłowo zrealizowałeś zapis do pliku, nie masz powodu do obaw. Wystarczy teraz wpisać:

load bud

Jeśli z zapisem poszło coś nie tak… musisz powtórzyć operacje tworzenia macierzy BMdaneM z poprzednich stron. No i oczywiście najpierw wczytać dane z pliku, co opisane zostało w pierwszym wpisie :). Na zakończenie podam dwa polecenia ułatwiające zachowanie pewnej higieny pracy.

clc
close all

Pierwsze polecenie czyści okno poleceń (ale nie zmienne), drugie zamyka wszystkie otwarte okna wykresów. Optymistycznie zakładam, że koniec końców masz do dyspozycji dwie macierze:

a) BMdane – do tej zmiennej zaimportowałeś wszystkie dane numeryczne z pliku arkusza kalkulacyjnego.
b) BMdaneM – w tej zmiennej znajdują się przetworzone dane – w kolejnych kolumnach zapisano, ile mieszkań zostało oddanych do użytku w konkretnym miesiącu (w odróżnieniu do BMdane, gdzie podane są wartości skumulowane – licząc do stycznia).

(Visited 568 times, 1 visits today)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *