MATLAB Tutorial #7

Tworzenie skryptów

W zasadzie, do tej pory na każdym kroku podkreślałem, że MATLAB nie powinien być postrzegany wyłącznie jako język programowania. Jest to przede wszystkim środowisko obliczeniowe, w uproszczeniu można nawet powiedzieć: rozbudowany kalkulator. Niemniej jednak, wraz z rosnącą złożonością problemów obliczeniowych, przed jakimi stajemy, zmiana podejścia do programu jest nieunikniona. Realizując poprzednią część poradnika stworzyłeś procedurę, która w oparciu o wejściowe dane umożliwiła wyświetlenie wykresu przedstawiającego miesięczną liczbę oddanych do użytku mieszkań poczynając od roku 1991 po dzień dzisiejszy. Do tego doszło poszukiwanie miesiąca, dla którego liczba mieszkań osiągnęła maksimum oraz wszystkich nietypowych miesięcy, gdy liczba oddanych do użytku mieszkań przekroczyła dowolnie wskazany poziom. Zrealizowanie tego wymagało wpisania kilkunastu linii kodu. Nie jest to zbyt dużo i obiektywnie na to patrząc, stworzenie tego kodu nie było trudne. Jednak, jeśli przyszłoby nam wykonać identyczną analizę, ale ograniczoną np. wyłącznie do mieszkań „spółdzielczych”, znaczną część kodu należałoby wpisać ponownie Choć wymagane modyfikacje kodu są niewielkie, wklepywanie niemalże wszystkiego od początku w wierszu poleceń, to ewidentnie strata czasu. Na tym etapie warto sięgnąć po narzędzie, jakim jest skrypt.

Czym jest skrypt? W MATLABie jest to plik z rozszerzeniem .m, w którym zapisany został szereg procedur wykonanych jedna po drugiej. Skrypt można utworzyć na wiele różnych sposobów. Na pewno rzuca się w oczy przycisk New Script widoczny na pasku narzędzi HOME. Można również kliknąć w przycisk New i wybrać opcje Script z menu. Jeśli od razu chcemy wskazać miejsce na dysku, gdzie ma zostać zapisany m-plik, należy skorzystać z okna Current Folder. Po kliknięciu na pustej przestrzeni okna prawym przyciskiem myszy wybieramy opcję New File -> Script. Jak większość rzeczy w MATLABie, zadanie tworzenia nowego skryptu można wykonać również z poziomu Command Widnow - wystarczy wpisać polecenie edit

Tworzenie skryptu

  • Korzystając z dowolnej metody utwórz nowy skrypt.

  Domyślnie, skrypt otwiera się w nowym oknie. Jeśli podczas pracy skrypt gdzieś „zniknie”, sprawdź, czy okno ze skryptem nie schowało się przypadkiem pod głównym oknem MATLABa

schowane okno

Polecenia wpisywane w skrypcie mogą być takie same jak te, które wpisujemy w Command Window. Widoczna różnica jest taka, że podczas uzupełniania skryptu po wciśnięciu klawisza Enter, poza przejściem do nowej linii, nic się nie dzieje – polecenie nie jest wykonywane.

  • Uzupełni skrypt wpisując przykładowy kod:
T = 1; %czas obserwacji
dt = 0.1;
t = 0:dt:T-dt;
x = sin(2*pi*t);
plot(t, x);
xlabel('czas [s]');
title('x = sin(2\pit)') % ciąg znaków \pi zostanie wyświe-tlony jako... pi

Jednym ze sposobów na wywołanie instrukcji zebranych w skrypcie, jest wciśnięcie zielonego przycisku Run widocznego na pasku narzędzi w zakładce EDITOR. Przed uruchomieniem skryptu niezbędne jest zapisanie go na dysku w formie m-pliku. Jeśli skrypt nie został jeszcze zapisany, to przy pierwszej próbie uruchomienia pojawi się odpowiednie okno zapisu.

uruchomienie srkyptu

  • Zapisz skrypt po nazwą testowy w katalogu roboczym MATLABa (czyli w katalogu domyślnym)
  • Wciśnij przycisk Run

sinusz szarpany

Wygenerowany wykres nie wygląda najlepiej. Krok dt okazał się zbyt mały, lecz poprawa tego stanu rzeczy jest teraz trywialnie prosta.

  • Edytując skrypt testowy.m zmień wartość przypisywaną do zmiennej dt na 0.01 oraz zwiększ czas obserwacji T do 2 sekund
  • Uruchom ponownie skrypt

sinus gładki

Dzięki temu, że wszystkie niezbędne do wygenerowania sygnału i utworzenia wykresu instrukcje zebrane były w skrypcie, modyfikacja procedury może odbyć się błyskawicznie. Kolejną olbrzymią zaletą skryptów jest to, że ich zawartość nie ulatnia się po zakończeniu sesji z MATLABem. Raz zapisany skrypt pozostaje na dysku i możemy go ponownie otworzyć od edycji. W tym celu należy skorzystać z przycisku Open widocznego na pasku narzędzi w zakładce HOME lub, prościej, kliknąć dwukrotnie lewym przyciskiem myszy na pliku w oknie Current Folder. Alternatywnie, plik możemy otworzyć wpisując polecenie

edit nazwa_pliku

Jeśli plik o podanej nazwie nie istnieje, zostanie utworzony, jeśli jest już obecny na dysku, zostanie otworzony do edycji.
Wywołanie przygotowanej w skrypcie procedury nie wymaga otwarcia pliku do edycji. Wystarczy, że w Command Window podamy nazwę skryptu (bez rozszerzenia .m)

  • Ponownie wywołaj skrypt testowy wpisując jego nazwę w Command Window

  Teraz, gdy wiesz już jak tworzyć skrypty, praca z MATLABem stanie się jeszcze prostsza. Nie oznacza to jednak, że bezpośrednie wpisywanie procedur w Command Window straciło kompletnie sens. W zasadzie, czasem nawet wygodniej jest w pierwszej kolejności poeksperymentować sobie z danymi w tym trybie. To, czy zacząć pracę z wierszem poleceń, czy też od razu przejść do tworzenia skryptu, jest kwestią indywidualnych preferencji. Zresztą, jeśli wpisujemy coś w command window, MATLAB zapisuje to w swojej historii. Możemy to nawet zręcznie wykorzystać.

  • Korzystając z przycisku Layout uaktywnij okno historii poleceń Layout -> Command History -> Docked

Możesz teraz zaznaczyć kilka interesujących cię poleceń (korzystając z kombinacji klawisza alt + LPM), kliknąć następnie PPM i wybrać opcje Create Script

historia poleceń

Jeśli nie minęło wiele czasu od momentu, w którym przerabiałeś poprzedni rozdział tego poradnika, zapewne z łatwością możesz odszukać polecenia wykorzystane w MATLAB Tutorial #6 i na ich podstawie stworzyć skrypt. Możesz też wykorzystać gotowca przedstawionego poniżej, co zapewne będzie nieco mniej frustrujące. W każdym razie, utwórz skrypt, wypełnij go zawartością i zapisz jako budownictwo_analiza.

load bud
ogolemM = BMdaneM(2:6:end,:)'; % wybranie danych i transpozycja (operator - apostrof)
ogolemV = ogolemM(:); % konwersja na wektor
t1 = datetime(1991,1,31);
dt = calendarDuration(0,1,0);
N = length(ogolemV); % zapisanie informacji o długości wek-tora
t = t1:dt:t1+(N-1)*dt;
plot(t, ogolemV);

Zanim przejdziemy dalej, mam dla ciebie jeszcze jedną wskazówkę techniczną. Domyślnie, edytor otwiera się w nowym oknie. Jest to na pewno wygodnie rozwiązanie, jeśli pracujemy na dwóch niezależnych monitorach lub na jednym naprawdę dużym, na którym możemy wygodnie poustawiać okna obok siebie. Gorzej, jeśli miejsca jest mało i MATLAB otwarty jest w trybie pełnoekranowym. W takim wypadku okno edytora będzie zazwyczaj gubiło się pod głównym oknem programu. Rozwiązaniem jest zadokowanie okna edytora do głównego okna MATLABa. Można to zrobić klikając na małą ikonę w prawej górnej części okna edytora i wybierając opcję Dock Editor. Zadokowane okno można oczywiście również dostosować do swoich potrzeb. Zakładki widoczne dotychczas w górnej części okna Edytora trafiły do zbioru zakładek głównego okna MATLABa.

dokowanie okna edytora

Wracając do naszego nowego skryptu budownictwo_analiza, zajmiemy się teraz jego modyfikacją. Analizę należy teraz przeprowadzić dla dwóch indywidualnych grup mieszkań: oznaczonych jako spółdzielcze oraz indywidualne.

  • Zmodyfikuj skrypt budownictwo_analiza tak, by zamiast mieszkań ogółem na wykresie znalazły się dwa przebiegi: dla mieszkań "spółdzielczych" i „indywidualnych”.
  • Postaraj się umieścić w kodzie jak najwięcej komentarzy.
load bud % wczytanie danych z mat-pliku
spoldzielczeM = BMdaneM(3:6:end,:)'; % wybranie danych i transpozycja (apostrof)
spoldzielczeV = spoldzielczeM(:); % konwersja na wektor
t1 = datetime(1991,1,31); % określenie punktu startowego
dt = calendarDuration(0,1,0); %krok - jeden miesiąc
N = length(spoldzielczeV); % wyliczenie długości wektora
t = t1:dt:t1+(N-1)*dt; % tworzenie wektora czasu
indywidualneM = BMdaneM(4:6:end, :)';
indywidualneV = indywidualneM(:);
% nie ma potrzeby ponownego tworzenia wektora czasu!

% wykres
plot(t, spoldzielczeV, t, indywidualneV)
title('Mieszkania oddane do użytku od r. 1991')
legend({'spółdzielcze'; 'indywidualne'})
grid on

Z komentarzami zetknąłeś się już we wcześniejszych wpisach. To tekst umieszczony za znakiem %, który nie jest w żaden sposób interpretowany przez MATLABa podczas wykonywania polecenia. Komentarze służą użytkownikom jako wskazówki, czego dotyczy dany fragment kodu i dobrze jest wyrobić sobie nawyk ich tworzenia. Patrząc na krótkie fragmenty dotychczasowego kodu mogłeś dojść do wniosku, że wszystko jest na tyle jasne, że komentarze są zbędne. To niestety mylne wrażenie. Jeśli przyjdzie ci kiedyś tworzyć skrypt z kilkudziesięcioma liniami kodu, to nawet jedna dłuższa przerwa na kawę wystarczy, byś po powrocie przed ekran komputera był zmuszony zająć się dedukcją, o co w tym Twoim „dziele” chodzi. Jeśli wrócisz do swojego niekomentowanego kodu po dwumiesięcznej przerwie, to gwarantuję, że przy próbie zrozumienia zawiłości algorytmu będziesz miał ochotę uderzyć autora pięścią w nos. Komentowanie, co jest niezależne od środowiska programistycznego, w którym przyjdzie Ci pracować, pozwala oszczędzić sobie frustracji. Komentowanie w MATLAbie niesie za sobą dodatkowe korzyści.

Przede wszystkim, wstawienie w nowej linii skryptu podwójnego znaku % (czyli %%) sprawia, że skrypt dzielony zostaje na sekcje.

  • Utwórz nowy skrypt, analiza_budownictwo_sec, i uzupełnij go poniższym kodem.
%% Wczytanie danych z mat-pliku
load bud 
%% Wybór danych - budownictwo spółdzielcze i indywidualne
spoldzielczeM = BMdaneM(3:6:end,:)'; 
indywidualneM = BMdaneM(4:6:end, :)';
% konwersja macierzy na wektory
spoldzielczeV = spoldzielczeM(:);
indywidualneV = indywidualneM(:);
%% Utworzenie wektora czasu 
t1 = datetime(1991,1,31); % określenie punktu startowego
dt = calendarDuration(0,1,0); % określenie kroku - jeden miesiąc
N = length(spoldzielczeV); % wyznaczenie długości wektora
t = t1:dt:t1+(N-1)*dt; % stworzenie wektora czasu
%% Tworzenie wykresu
plot(t, spoldzielczeV, t, indywidualneV)
title('Mieszkania oddane do użytku od r. 1991')
legend({'spółdzielcze'; 'indywidualne'})
ylabel('ilość miesięcznie oddanych mieszkań')
grid on;

Zwróć uwagę, że po kliknięciu na obszar w skrypcie znajdujący się pomiędzy liniami rozpoczynającymi się od znaków %%, zostaje on podświetlony. Jeśli przyglądniesz się zawartości zakładki EDITOR, to zauważysz, że po prawej stronie od przycisku Run znajduje się jeszcze kilka innych przycisków z ikonką wskazującą, że one również „coś” uruchamiają. Interesują nas w tym momencie dwa z tych przycisków. Mniejszy, Run Section, pozwala na wykonanie aktualnie podświetlonej sekcji kodu. Run and Advance z kolei wykonuje kod z zaznaczonej sekcji i podświetla kolejną sekcję znajdującą się w skrypcie. Ten drugi przycisk jest większy, bo właśnie z niego najczęściej korzystamy. Podział, a następnie wykonywanie skryptu kawałkami pozwala użytkownikowi na lepsze zarządzenie procesem wykonywania skryptu, a także jest podstawowym sposobem wyszukiwania i poprawiania błędów (choć nie jest to tryb debugowania, o nim będzie jeszcze później).

zakładka EDIT

Na koniec bonus. Dobrze opisany i podzielony na sekcje skrypt może posłużyć nam do automatycznego wygenerowania raportu z przeprowadzonych obliczeń. W celu uzyskania raportu, należy przejść do zakładki PUBLISH i wcisnąć przycisk Publish. Spowoduje to wykonanie się kodu zawartego w skrypcie oraz stworzenie raportu, domyślnie w formacie HTML, Klikając na małą strzałeczkę pod przyciskiem Publish możemy zmienić kilka ustawień związanych z tym, w jaki sposób raport jest generowany, włączając w to format pliku wyjściowego.

publish - opcje

Raport może być tworzony w formatach html, pdf, word i innych. Liczne przyciski, widoczne po lewej stronie przycisku Publish, pozwalają uzyskać podpowiedź, w jaki sposób należy formatować tekst wpisany w komentarzu, by w raporcie uzyskać efekt taki jak kursywa, pogrubienie czy wypunktowanie. Jeśli pod nazwą sekcji umieścimy „zwykły” komentarz (tzn. linię rozpoczniemy od pojedynczego znaku %), to w raporcie tekst ten pojawi się w formie zwykłego opisu. Wszelkie późniejsze komentarze pojawiające się w sekcji zostaną w raporcie przedstawione w oryginalniej formie komentarza.

%% 
% M - plik demontrujący możliwości generowania prostych raportów z obliczeń
% w środowisku MATLAB
%% Wczytanie danych z mat-pliku
load bud 

%% Wybór danych 
% Z zestawu danych wybrane zostają dane dotyczące budownictwa
%%
% 
% * spódzielczego
% * indywidualnego
% 

spoldzielczeM = BMdaneM(3:6:end,:)'; 
indywidualneM = BMdaneM(4:6:end, :)';
% konwersja macierzy na wektory
spoldzielczeV = spoldzielczeM(:);
indywidualneV = indywidualneM(:);

%% Utworzenie wektora czasu odpowiadającego analizowanym danym 
% Wektor czasu jest tworzony z wykorzystaniem dedykowanego tupy danych |datetime|

t1 = datetime(1991,1,31); % określenie punktu startowego
dt = calendarDuration(0,1,0); % określenie kroku - jeden miesiąc
N = length(spoldzielczeV); % wyznaczenie długości wektora
t = t1:dt:t1+(N-1)*dt; % stworzenie wektora czasu

%% Tworzenie wykresu
plot(t, spoldzielczeV, t, indywidualneV)
title('Mieszkania oddane do użytku od r. 1991')
legend({'spółdzielcze'; 'indywidualne'})
ylabel('ilość miesięcznie oddanych mieszkań')
grid on;

%% Poszukiwanie wartości maksymalnych

[ind_max, ind_idx] = max(indywidualneV);
[spol_max, spol_idx] = max(spoldzielczeV);
% Wyswietlenie komunikatów
disp('Najwęcej mieszkań w kategorii indywidualne oddano do użytku:');
disp(t(ind_idx))
disp('Najwęcej mieszkań w kategorii spoldzielcze oddano do użytku:');
disp(t(spol_idx))

MATLAB Publish

(Visited 2 364 times, 6 visits today)

Dodaj komentarz

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