MATLAB Tutorial #2

Tutorial ten stanowi pewną całość i w wielu wpisach będę odwoływał się do wpisów poprzednich. A ostatni wpis zakończyłem na podaniu informacji, jak w szybki sposób można zapisać efekty swojej pracy w MATLABie do  wykorzystania później. Jeśli to zrobiłeś, to teraz możesz wczytać dane z zapisanego ostatnio pliku matlab.mat Wystarczy odnaleźć w oknie Current Folder odpowiedni plik i kliknąć na nim dwukrotnie LPM.

matlab.mat

W oknie Workspace powinny znaleźć się teraz dane dotyczące budownictwa mieszkaniowego w Polsce. W zmiennej BMdane masz dostęp do wszystkich danych z lat 1991 - 2015 zebranych w jednej macierzy, w pozostałych zmiennych znajdują się wybrane dane dla poszczególnych lat. Jeśli nie masz pliku... zapraszam do poprzedniego wpisu 🙂

  • Wyświetl teraz dane dotyczące budownictwa spółdzielczego dla lat 1991 oraz 2001 na jednym wspólnym wykresie.
bar([spoldzielcze1991' spoldzielcze2001])

Budownictwo spółdzielcze 1991 vs 2001

Tworzenie macierzy w MALTAB

Zwróć uwagę na składnię powyższego polecenia. Przy zmiennej spoldzielcze1991 mamy apostrof, przy zmiennej spoldzielcze2001 -  nie. Wynika to z konieczności odpowiedniego ułożenia wektorów przed ich wspólnym wyświetleniem w formie wykresu. Sprawdź zresztą sam, co się stanie, gdy spróbujesz połączyć oba wektory w jedną zmienną bez zwracania uwagi na takie szczegóły, jak ich ułożenie.

  • Wpisz w oknie poleceń MATLABa:
temp = [spoldzielcze1991 spoldzielcze2001] 

W rezultacie MATLAB wyświetli informację o błędzie.
Error using horzcat
Dimensions of matrices being concatenated are not consistent.

Komunikat mówi o tym, że rozmiary macierzy (w naszym przypadku wektorów), które chciałeś skleić, nie są spójne. Jest to oczywiste -  jeden z wektorów "stoi", drugi "leży". Błędu nie zwrócą natomiast cztery poniższe operacje:

A = [spoldzielcze1991' spoldzielcze2001]
B = [spoldzielcze1991 spoldzielcze2001']
C = [spoldzielcze1991'; spoldzielcze2001]
D = [spoldzielcze1991; spoldzielcze2001']

Zmienne zostały połączone ze sobą na 4 sposoby. W przypadku A i B wektor spoldzielcze2001 został "doklejony" z prawej strony wektora spoldzielcze1991, natomiast w przypadku C i D wektor spoldzielcze2001 został wstawiony pod wektor spoldzielcze1991. Kiedy tworzysz macierz i wykorzystujesz znak średnika, dla MATLABa oznacza to: wstaw pod spodem (utwórz nowy wiersz). Spróbuj trochę poćwiczyć tworzenie wektorów i macierzy w MATLABie:

  • Stwórz wektor a o rozmiarze 1x3 (wektor "leżący" - jeden wiersz, 3 kolumny) sklejając ze sobą liczby 1,3 i 5,
  • Stwórz wektor b o rozmiarze 3x1 sklejając ze sobą liczby 2,4 i 6,
  • Stwórz wektor c łącząc dowolnie wektory a i b w jedną macierz
a = [1 3 5]
b = [2; 4; 6]
c = [a' b]

A teraz spróbuj stworzyć macierz Z, która będzie wyglądała tak:

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

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

Mam nadzieję, że teraz wszystko jest już jasne. Podsumowując, w MATLABie tworzymy macierze umieszczając pomiędzy znakami [ ] liczby, bądź istniejące macierze. Oddzielamy je od siebie spacją (lub przecinkiem), jeśli kolejne elementy mają znaleźć się w kolejnych kolumnach. Znaku średnika (;) używamy, kiedy chcemy wstawić następne elementy do kolejnego wiersza.

Nowe macierze możemy tworzyć "klejąc" mniejsze macierze, ale również wycinając kawałki większych macierzy. Pokazałem to w pierwszej części MALTAB Tutorial #1 wyciągając z dużej tabeli z danymi pojedyncze wiersze. Analogicznie można wyciągnąć z wektora pojedynczy element.

  • Wyświetl informację dotyczącą wielkości budownictwa mieszkaniowego w styczniu 1991
styczen1991 = ogolem1991(1) 

Jak wyciągnąć dane dotyczące lutego 1991? Wydaje się, że nic prostszego.

styczen_luty1991 = ogolem1991(2) 

Jest jednak pewien problem. Dane znajdujące się na drugiej pozycji wektora ogolem1991 to nie informacja o liczbie mieszkań oddanych do użytku w lutym, a o liczbie mieszkań oddanych do użytku w przedziale czasu od początku roku do końca lutego. Widać to zresztą wyraźnie na wykresie, który stworzyłeś chwilę temu - dane zebrano narastająco. Nie trudno wpaść na to, co trzeba zrobić, aby otrzymać informację dotyczącą liczby mieszkań oddanych do użytku w konkretnym miesiącu. Dla lutego: od danych sumarycznych dotyczących lutego (druga komórka) odejmujemy wynik dla stycznia (pierwsza komórka). Dla czerwca: od danych sumarycznych dotyczących czerwca (szósta komórka) odejmujemy dane sumaryczne dotyczące maja (piąta komórka). Pozostaje pytanie: jak taką operację sprawnie przeprowadzić w MATLABie? W tym momencie warto sięgnąć do dokumentacji i sprawdzić, czy może w MATLABie jest już gotowa funkcja, która rozwiąże nam problem.

Dokumentacja w programie MATLAB

  • Otwórz dokumentację wpisując w Command Window polecenie doc

Dokumentacja programu została stworzona w języku angielskim i raczej nie ma co liczyć na to, że kiedykolwiek pojawi się jej oficjalne tłumaczenie na język polski.

MATLAB dokumentacja

Dokumentacja MATLABa to jedna z najmocniejszych stron środowiska. Omawiane zagadnienia oraz opisy funkcji obliczeniowych zawsze ilustrowane są czytelnymi przykładami, co znacznie ułatwia korzystanie z programu. Dokumentację można przeglądać działami, można też skorzystać z wyszukiwania, by szybko odnaleźć informację dotyczącą interesującego nas zagadnienia czy procedury obliczeniowej.

  • W okienku wyszukiwania wpisz hasło, które może pomóc nam odnaleźć odpowiednią funkcję. Twoim hasłem będzie „różnica”, czyli po angielsku „difference".
  • Wyniki wyszukiwania są bardzo obszerne. Nie poszukujesz niczego specjalnego, ani związanego z jakimś konkretnym obszarem wiedzy, więc w panelu po lewej stronie w sekcji Refine by Product kliknij MATLAB.

Liczba dostępnych tematów zmniejszy się dramatycznie. Możesz teraz wgryzać się w opisy poszczególnych funkcji, ale nie ma takiej potrzeby. Podpowiem Ci, że interesuje nas funkcja diff.

Posługiwanie się wbudowanymi funkcjami obliczeniowymi

Spróbuj wykorzystać wyszukaną funkcję. W celu uruchomienia procedury obliczeniowej należy wprowadzić jej nazwę, a następnie w nawiasach okrągłych podać, na jakich danych funkcja ma operować. Wynik działania można przypisać do nowej zmiennej.

  • Wpisz w Command Window poniższą instrukcję. Litera M na końcu nazwy zmiennej będzie Ci przypominać, że chodzi o dane miesięczne.
ogolem1991M = diff(ogolem1991)

Wynik działania został wyświetlony na ekranie. Operacja przebiegła prawidłowo, jest jednak jedno „ale” - w wyniku wywołania funkcji dla naszego wektora 12-elementowego, otrzymaliśmy wektor 11-elementowy. Jest to w sumie logicznie, funkcja zwraca nam różnice pomiędzy elementami, a tych różnic jest 11. Dla nas oznacza to, że w wektorze wyjściowym nie ma informacji o tym, ile mieszkań oddano do użytku w styczniu. Ta informacja mieści się jednak w pierwszej komórce wektora ogolem1991, więc nie ma problemu, musimy tylko „przykleić” te dane do nowego wektora ogolem1991M. A wiesz już zapewne, jak to zrobić.

ogolem1991M = [ogolem1991(1) ogolem1991M]

Oczywiście operacji nie trzeba przeprowadzać „na raty”, możemy ją przeprowadzić w jednej linii poleceń.

  • Wyznacz miesięczne ilości mieszkań oddanych do użytku mieszkań w roku 2001
ogolem2001M = [ogolem2001(1); diff(ogolem2001)]

Tutaj mała uwaga - w pierwszym wypadku doklejałeś element do wiersza, w drugim przypadku do kolumny -  stąd obecność znaku „;”.

Przedstaw wyniki wykorzystując funkcję bar

figure
bar([ogolem1991M' ogolem2001M])

W ten sposób możesz konwertować kolejne zmienne znajdujące się w Worskpace. Załóżmy jednak, że chcesz wyznaczyć liczbę oddanych miesięcznie do użytku mieszkań dla wszystkich dostępnych lat (od 1991 do 2015) i typów (ogółem, spółdzielcze, indywidualne itd.). W tym celu funkcję diff najlepiej wykonać od razu dla całej macierzy BMdane. Jest to troszkę trudniejsze zadanie, które rozłożymy na kilka etapów. Ale o tym przeczytasz już w kolejnym wpisie.

(Visited 2 894 times, 1 visits today)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *