POLITECHNIKA ŁÓDZKA
Katedra Techniki Cieplnej i Chłodnictwa
TECHNOLOGIE
INFORMATYCZNE
MATLAB
Część III
Temat: Elementy programowania
Opracował: dr inż. Artur Gutkowski
Łódź - 2008
Katedra Techniki Cieplnej i Chłodnictwa
90-924 Łódź; ul. Stefanowskiego 1/15
tel. 042 631 23 12; 042 631 23 11; fax 042 636 74 81; e-mail: k15@p.lodz.pl
Spis Treści
1. Wstęp .......................................................................................................................................... - 3 -
2. Operatory relacji ......................................................................................................................... - 3 -
3. Operatory logiczne...................................................................................................................... - 5 -
4. Instrukcje..................................................................................................................................... - 7 -
5. Skrypty i funkcje....................................................................................................................... - 12 -
6. Literatura................................................................................................................................... - 15 -
- 3 -
1. Wstęp
MATLAB tak jak i inne współczesne języki programowania wysokiego poziomu został
wyposażony w różnego rodzaju instrukcje sterujące, które umożliwiają tworzenie algorytmów
i programów. W niniejszej instrukcji zostały omówione sposoby korzystania z operatorów relacji,
operatorów logicznych a także instrukcji. Omówiono także podstawy tworzenia plików tekstowych
tzw. M-plików.
2. Operatory relacji
MATLAB dysponuje sześcioma operatorami relacji, które pozwalają na dokonywanie
porównań pomiędzy wyrażeniami. Wynikiem porównania jest albo prawda (TRUE (1)) albo fałsz
(FALSE (0)). Poniżej zostały przedstawione operatory relacji oraz ich sposób zapisu w MATLAB-
ie:
• mniejszy (<)
• mniejszy lub równy (< =)
• większy (>)
• większy lub równy (> =)
• równy (= =)
• różny (~ =)
Sprawdźmy jak sprawują się powyższe operatory podczas porównań skalarów i wektorów. Na
początek porównajmy dwie liczby:
>> 4 < 9
ans =
1
>>
W tym przypadku odpowiedzią programu jest prawda (1) cztery jest mniejsze od dziewięciu.
>> 4 > 9
ans =
0
>>
Jeżeli odwrócimy znak, MATLAB zwróci fałsz (0), ponieważ 4 nie jest większe od 9.
W przypadku porównania skalara z wektorem, program porównuje skalara z każdym
elementem wektora. Wynikiem jest wektor o takim samym rozmiarze jak ten porównywany,
składający się z zer i jedynek np.:
>> A = [5, 7, 9];
>> 8 < A
ans =
0 0 1
>>
- 4 -
Poniższy zapis oznacza, że mają być wyświetlone te elementy wektora A, które spełniają
warunek zawarty w nawiasie:
>> A(8 < A)
ans =
9
>>
Poniżej jest przedstawiony sposób wyświetlania elementów spełniających warunek,
jednocześnie z zachowaniem ich pozycji w wektorze:
>> A.*(8 < A)
ans =
0 0 9
>>
Przeanalizujmy teraz powyższy zapis. Wynikiem operacji zawartej w nawiasie jest wektor
składający się z zer i jedynek w zależności czy dany element spełnia warunek czy nie. Następnie
ten wektor jest mnożony tablicowo z wektorem A. W miejscu gdzie warunek był fałszywy
odpowiedni element macierzy A jest mnożony przez zero, a tam gdzie był prawdziwy dany element
macierzy A jest mnożony przez jeden. Dzięki temu w miejscach gdzie warunek nie był spełniony
otrzymujemy zero a w miejscach, gdzie warunek był spełniony jest wyświetlana dana liczba.
W przypadku porównywania dwóch wektorów należy pamiętać, że muszą one mieć ten sam
rozmiar, ponieważ porównywane są elementy o tych samych współrzędnych np.:
>> A = [5, 7, 9];
>> B = [1, 8, 3];
>> A < B
ans =
0 1 0
>>
W jednym wierszu można porównywać kilka liczb, ale trzeba pamiętać o kilku rzeczach. Po
pierwsze MATLAB pracuje od strony lewej do prawej. Po drugie po pierwszym porównaniu
program porównuje wynik tej operacji czyli 0 lub 1 z następną liczbą, dla lepszego zrozumienia
prześledźmy następującą operację:
>> 9 < 6 < 2
ans =
1
>>
W pierwszej kolejności MATLAB sprawdza czy 9 < 6, wynikiem tego jest fałsz czyli 0,
następnie porównuje czy 0 < 2, wynikiem jest prawda czyli 1.
Jeżeli w zapisie pojawiają się nawiasy program w pierwszej kolejności wykonuje działanie
umieszczone w nawiasach np.:
>> 9 < (6 < 2)
ans =
0
- 5 -
Czyli najpierw sprawdza czy 6 < 2, wynikiem jest fałsz czyli 0, a następnie porównuje czy
9 < 0, w tym przypadku wynikiem także jest fałsz (0).
Podobne działanie jak = = ma funkcja isegual:
>> A = [8, 4, 5, 2];
>> B = [2, 5, 5, 2];
>> C = isequal(A, B)
C =
0
%dwie macierze są różne
>> B = [8, 4, 5, 2];
>> C = isequal(A, B)
C =
1
%dwie macierze są takie same
>>
3. Operatory logiczne
Poniżej przedstawiono operatory logiczne, z którymi pracuje MATLAB:
• iloczyn logiczny AND (&), (koniunkcja),
• suma logiczna OR (|), (alternatywa),
• negacja logiczna NOT (~), (zaprzeczenie),
• różnica symetryczna XOR.
Sposób działania tych operatorów został przedstawiony w Tabeli 1.
Tabela 1. Sposób działania operatorów logicznych.
A
B
(~A)
A & B
A | B
XOR(A,B)
0 0 1 0 0 0
1 0 0 0 1 1
0 1 1 0 1 1
1 1 0 1 1 0
Musimy pamiętać, że MATLAB traktuje wszystkie liczby różne od zera jako prawdę a
wszystkie zera jako fałsz. Dlatego też liczba – 3 jest logicznie prawdą a negacją będzie zero:
>> ~-3
ans =
0
>>
W przypadku wektora A, zwracany jest wektor składający się z negacji poszczególnych
elementów A:
>> A = [8, 0, -2, 0, 5];
>> ~A
ans =
0 1 0 1 0
- 6 -
Operator AND zwraca prawdę tylko w przypadku, gdy obydwa elementy są TRUE,
w innym przypadku zwraca fałsz np.:
>> 5 & 0
ans =
0
>> 0 & 0
ans =
0
>> 5 & 2
ans =
1
>>
I w przypadku wektorów:
>> A = [5 0 0 3 1];
>> B = [1 2 0 4 0];
>> A & B
ans =
1 0 0 1 0
>>
Jak widać z Tabeli 1 operator OR zwraca prawdę tylko wtedy, gdy chociaż jeden
z porównywanych elementów jest TRUE np.:
>> 3 | 0
ans =
1
>> 3 | 3
ans =
1
>> 0 | 0
ans =
0
>>
Podobnie jest w przypadku wektorów:
>> A = [5 0 0 3 1];
>> B = [1 2 0 4 0];
>> A | B
ans =
1 1 0 1 1
>>
XOR działa w ten sposób, że zwraca prawdę w przypadku, gdy jeden z elementów jest
TRUE a drugi FALSE a w innych przypadkach zwraca fałsz np.:
>> A = [5 0 0 3 1];
>> B = [1 2 0 4 0];
>> xor(A, B)
- 7 -
ans =
0 1 0 0 1
>>
Innymi funkcjami logicznymi, którymi dysponuje MATLAB są: all (wszystkie) i any
(jakiś). Pierwsza funkcja zwraca prawdę tylko wtedy, gdy wszystkie elementy danego wektora są
TRUE. Druga funkcja zwraca prawdę w przypadku, gdy chociaż jeden element wektora jest TRUE
np.:
>> A = [5 0 0 3 1];
>> any(A)
ans =
1
>> all(A)
ans =
0
>>
4. Instrukcje
Instrukcje, które są dostępne w MATLAB-ie ogólnie można podzielić na warunkowe,
wyboru i iteracyjne. Do pierwszych z nich zaliczamy instrukcję if-elseif-else-end, do
drugiej instrukcję switch-case-otherwise-end, a do trzeciej pętle for-end i while-
end.
Ogólna postać instrukcji if jest przedstawiona poniżej:
if
wyrażenie logiczne 1
instrukcja 1
elseif
wyrażenie logiczne 2
instrukcja
2
else
instrukcja
3
end
Sposób jej działania wygląda następująco: program sprawdza jako pierwsze „wyrażenie
logiczne 1” jeżeli jest „prawdziwe” to wykonuje „instrukcję 1”. Jeżeli „wyrażenie logiczne 1” było
„fałszywe” to program przechodzi do „wyrażenia logicznego 2” w przypadku „prawdy” wykonuje
je, w przypadku „fałszu” przechodzi dalej. Poniżej napiszemy procedurę analizującą wiek osoby
i przypisującą ją do jednej z trzech grup: dziecko, młodzież, dorosły, do wyświetlenia wyniku
posłuży funkcja disp:
>> Wiek = 14;
%wprowadzamy wiek osoby
>>
if
Wiek <= 12
%warunek 1
disp(
‘dziecko’
)
elseif
Wiek <= 18
%warunek 2
- 8 -
disp(
‘mlodziez’
)
else
%pozostałe przypadki
disp(
‘dorosly’
)
end
mlodziez
%wyświetlany wynik
>>
Przy powyższym zapisie wyrażeń logicznych znaczenie ma kolejność ich występowania.
Gdyby na przykład zamienić miejscami pierwszy i drugi warunek a wielkość Wiek = 11, która jest
mniejsza niż 18, osoba byłaby zakwalifikowana do młodzieży. Dla ułatwienia pracy MATLAB
zmienia kolor słów kluczowych.
Instrukcja switch sprawdza wartość wyrażenia i w zależności od tego wyniku przypisuje
wykonanie pewnych instrukcji. Schemat instrukcji switch przedstawiono poniżej:
switch
wyrażenie
case
1
instrukcja 1
case
2
instrukcja
2
otherwise
instrukcja
3
end
Jako przykład podajmy zamianę oceny zapisanej jako cyfra na ocenę zapisaną słownie:
>>
Ocena
=
4;
%zamieniana ocena
>>
switch
Ocena
%Wyrażenie
case
1
%Ocena = 1
disp(
‘niedostateczna’
)
case
2
%Ocena = 2
disp(
‘mierna’
)
case
3
%Ocena = 3
disp(
‘dostateczna’
)
case
4
%Ocena = 4
disp(
‘dobra’
)
case
5
%Ocena = 5
disp(
‘bardzo dobra’
)
case
6
%Ocena = 6
disp(
‘celujaca’
)
end
dobra
%wyświetlany wynik
>>
Po słowach case wymieniane są wartości jakie może przybierać wielkość Ocena. I tak na
przykład, gdy Ocena równa się 2 zostanie zrealizowana druga instrukcja, która wyświetli napis
„mierna” itd. Liczby po słowach case nie oznaczają kolejnych numerów tylko możliwe wartości
wielkości Ocena.
- 9 -
Pętle są to podstawowe konstrukcje stosowane w programowaniu, umożliwiają cykliczne
wykonywanie ciągu instrukcji. Pętla for jest stosowana w tych przypadkach, w których z góry
wiadome jest ile razy ma powtórzyć cykl obliczeniowy (iteracje).
Poniżej przedstawiono ogólną postać pętli for:
for
zmienna = 1:n
instrukcja
instrukcja
instrukcja
instrukcja
end
Należy pamiętać, że każda pętla musi kończyć się słowem end. Poniżej przedstawiony
przykład pętli for:
>> A = 0;
>>
for
i = 1:3
A = A + i;
end
>> A
A =
6
>>
Teraz wytłumaczymy jak działa powyższy zapis. Przed rozpoczęciem działania pętli
definiujemy początkową wartość A. Widzimy, że i przyjmuje wartości: 1, 2 i 3. Może budzić
wątpliwości równanie: A = A + i. Z punktu widzenia matematyki zapis ten jest prawdziwy (w
powyższym przypadku) tylko dla i = 0, poza tym jest bez sensu, ale w tym przypadku oznacza
on, że wartość A w następnym kroku równa się wartości A z poprzedniego kroku powiększonej o i.
Zapiszmy kolejne etapy obliczania A:
A = 0
i = 1
Pierwszy krok = A + i = 0 + 1 = 1
A = 1
i = 2
Drugi krok
= A + i = 1 + 2 = 3
A = 3
i = 3
Trzeci krok
= A + i = 3 + 3 = 6
A = 6
MATLAB umożliwia także podgląd poszczególnych etapów działania pętli, ale jest to
wskazane tylko wtedy, gdy ilość ich jest niezbyt duża. A robimy to opuszczając średnik po
równaniu definiującym A:
>> A = 0;
>>
for
i = 1:3
A
=
A
+
i
%bez średnika
end
A =
1
A =
- 10 -
3
A =
6
>>
W niektórych przypadkach można otrzymać podobny efekt jak podczas działania pętli,
wykorzystując tzw. wektoryzację, czyli użycie dwukropka. Poniżej przedstawiony jest przykład
takiego działania w odniesieniu do przykładu obliczonego z użyciem pętli for:
>> A = sum(1:3)
A =
6
>>
Ważne jest, że jeżeli mamy wybór pomiędzy pierwszą a drugą metodą, zawsze powinniśmy
wybierać tę drugą (wektoryzację), ponieważ ten sposób obliczeń jest wygodniejszy dla MATLAB-a
i tego rodzaju zadania są wykonywane przez niego znacznie szybciej.
Teraz za pomocą pętli for zdefiniujemy macierz, której elementy będą liczone z zależności
uwzględniającej współrzędne danego elementu:
>> A = [];
%definiujemy macierz
>>
for
i = 1:3
%definiujemy ilość wierszy
for
j = 1:2
%definiujemy ilość kolumn
A(i, j) = i + 2*j;
end
end
>> A
A =
3
5
4
6
5
7
>>
Każdy element macierzy jest opisany przez numer wiersza i kolumny. W tym przypadku
wartość poszczególnych elementów odpowiada ich numerom wierszy plus numery kolumn
pomnożone przez dwa. I tak:
A(i, j) = i + 2 * j
A(1, 1) = 1 + 2 * 1 = 3
A(1, 2) = 1 + 2 * 2 = 5
A(2, 1) = 2 + 2 * 1 = 4
A(2, 2) = 2 + 2 * 2 = 6
A(3, 1) = 3 + 2 * 1 = 5
A(3, 2) = 3 + 2 * 2 = 7
Poprzez usunięcie średnika przy definicji macierzy A (tak jak to było pokazane
w poprzednim przypadku) możliwe jest podpatrzenie metody dochodzenia do ostatecznego wyniku
podczas działania tej procedury:
- 11 -
A =
3
A =
3
5
A =
3
5
4
0
A =
3
5
4
6
A =
3
5
4
6
5
0
A =
3
5
4
6
5
7
>>
Można zauważyć, że podczas rozpoczęcia wypełniania nowych wierszy (A(2, 1),
A(3, 1)) MATLAB automatycznie dopisuje zera w kolejnych kolumnach (A(2, 2),
A(3, 2)). Jest to robione po to, żeby w każdym wierszu zgadzała się ilość kolumn.
Innym rodzajem funkcji iteracyjnej jest pętla while, która jest stosowana wtedy, gdy ilość
powtórzeń jest nam nie znana, obliczenia są wykonywane tak długo aż zajdzie dany warunek.
Ogólna postać tej pętli została przedstawiona poniżej:
while
wyrażenie logiczne
instrukcja
instrukcja
instrukcja
instrukcja
end
Pętla ta będzie działać tak długo aż „wyrażenie logiczne” będzie TRUE. Może się zdażyć, że
pętla będzie nieskończona co oznacza, że nigdy nie pojawi się FALSE i będzie działała
w nieskończoność. W takich przypadkach dobrze jest przerwać jej działanie klawiszami <Ctrl> +
<C>. Oto przykład takiej pętli:
>> A = -5;
%początkowa wartość A
>> i = 0;
%wprowadzenie pomocniczej wielkości
>>
while
A < 112
%wyrażenie logiczne
A = A + 2;
i = i + 1;
end
>>
i
%sprawdzenie ile iteracji zostało wykonanych
i =
59
>>
- 12 -
Zakładamy, że ilość iteracji jest nam nieznana. Zadanie rozpoczynamy od wartości -5
i chcemy stwierdzić ile razy musimy do tej wartości dodać 2, aby nasz wynik był większy od 112.
W tym przypadku musimy wprowadzić pomocniczą zmienną i, która przy każdej iteracji zwiększa
się o jeden.
5. Skrypty i funkcje
Wszystkie powyżej wymienione instrukcje byłyby mało użyteczne jeżeli za każdym razem
musielibyśmy je wpisywać w wierszu poleceń. Aby tego uniknąć mogą one być zapisane
w zewnętrznych plikach tekstowych z rozszerzeniem *.m (M-pliki). Rozróżniamy dwa rodzaje
plików tekstowych: skrypty i funkcje. W dalszej części czytelnik sam zauważy różnicę pomiędzy
skryptem a funkcją, należy tylko dodać, że powinno się zmierzać do tworzenia funkcji. Teraz
utworzymy pierwszy skrypt, który wykorzysta powyższą procedurę. Aby utworzyć nowy M-plik
z menu pulpitu wybieramy opcję File/New/M-file.
1
%Procedura zamienia Ocenę z liczby na wyraz
2
switch
Ocena
%Wyrażenie
3
case
1
%Ocena = 1
4
disp(
‘niedostateczna’
)
5
case
2
%Ocena = 2
6
disp(
‘mierna’
)
7
case
3
%Ocena = 3
8
disp(
‘dostateczna’
)
9
case
4
%Ocena = 4
10
disp(
‘dobra’
)
11
case
5
%Ocena = 5
12
disp(
‘bardzo dobra’
)
13
case
6
%Ocena = 6
14
disp(
‘celujaca’
)
15
end
Jak widzimy każdy wiersz jest numerowany, co jest bardzo pomocne podczas pracy z M-
plikami, oprócz tego dużym ułatwieniem jest zapisywanie procedur z odpowiednimi akapitami.
Dobrze jest, początek i koniec danej instrukcji umieszczać na tym samym poziomie np. switch
i end. Nazwijmy ten plik OcenaZamiana. Inną przydatną rzeczą jest krótki opis procedury, który
będzie przypominał co ona robi. A można go wywołać następująco:
>> help
OcenaZamiana
Procedura zamienia Ocenę z liczby na wyraz
>>
Istnieje kilka metod pracy z tego rodzaju plikami: można na przykład w wierszu poleceń
zdefiniować Ocena = 3 a następnie zaznaczyć całą procedurę w M-pliku i wcisnąć przycisk F9.
Zabieg ten spowoduje, że podświetlona zawartość zostanie skopiowana do wiersza poleceń
a następnie uruchomiona. Poniżej zostanie wyświetlony wynik jej działania. Można także ją
uruchomić w sposób pokazany poniżej:
>> Ocena = 3;
>> OcenaZamiana
dostateczna
- 13 -
W tym przypadku należy pamiętać, aby ścieżka była ustawiona do folderu, w którym plik
OcenaZamiana się znajduje. Można ten plik tak zmodyfikować, aby po uruchomieniu sam domagał
się podania wartości Oceny. W tym celu można wykorzystać funkcję input:
1
%Procedura zamienia Ocenę z liczby na wyraz
2
Ocena = input(
‘Podaj ocene: ‘
);
3
switch
Ocena
%Wyrażenie
4
case
1
%Ocena = 1
5
disp(
‘niedostateczna’
)
6
case
2
%Ocena = 2
7
disp(
‘mierna’
)
8
case
3
%Ocena = 3
9
disp(
‘dostateczna’
)
10
case
4
%Ocena = 4
11
disp(
‘dobra’
)
12
case
5
%Ocena = 5
13
disp(
‘bardzo dobra’
)
14
case
6
%Ocena = 6
15
disp(
‘celujaca’
)
16
end
A teraz prześledźmy jak to działa:
>>
OcenaZamiana
%uruchamiamy procedurę
Podaj
ocene:
4
%program domaga się oceny
dobra
%wyświetla wynik
>>
Tym razem przygotujmy M-plik z procedury kontrolującej wiek i zapiszmy go jako
KontrolaWieku.
1
Wiek = input(
‘Podaj wiek: ‘
);
2
if
Wiek <= 12
%warunek 1
3 disp(
‘dziecko’
)
4
elseif
Wiek <= 18
%warunek 2
5 disp(
‘mlodziez’
)
6
else
%pozostałe przypadki
7 disp(
‘dorosly’
)
8
end
Procedura ta ma jednak kilka niedociągnięć np. jeżeli podamy wiek -4 to wynikiem będzie
dziecko, jeżeli wpiszemy 2000 – dorosły. Musimy wstawić pewne ograniczenia np. wiek powinien
się zawierać pomiędzy 0 a 150. W tym celu dodamy nowy warunek:
1
Wiek = input(
‘Podaj wiek: ‘
);
2
if
Wiek <= 0 | Wiek > 150
3 disp(
‘Wiek powinien się zawierac pomiedzy 1-150’
)
4
elseif
Wiek <= 12
%warunek 1
5 disp(
‘dziecko’
)
6
elseif
Wiek <= 18
%warunek 2
7 disp(
‘mlodziez’
)
8
else
%pozostałe przypadki
9 disp(
‘dorosly’
)
- 14 -
10
end
Teraz utworzymy funkcję, która będzie obliczała silnię. Słowem kluczowym, które
używamy do definiowania funkcji jest function. Następnie wpisujemy równanie, w którym
z lewej strony znaku równości jest nazwa określająca wynik a po prawej stronie znajduje się nazwa
funkcji oraz zmienne, które umieszczone są w nawiasach. Należy pamiętać, że nazwa pliku musi
być taka sama jak nazwa funkcji.
1
function
wynik = silnia(n)
2
%funkcja silnia(n)
oblicza n!
3
wynik = 1
4
for
n = 1:n
5
wynik = wynik * n;
6
end
Dla przykładu policzmy wartość silni dla 5:
>> silnia(5)
ans =
120
>>
Możemy to także sprawdzić wykorzystując funkcję liczącą silnię, którą posiada MATLAB:
>> factorial(5)
ans =
120
>>
Stworzymy teraz funkcję w skład której będzie wchodziła pętla for jak również funkcja
pobierająca dane od użytkownika – input. Jej zadaniem będzie tworzenie macierzy:
1
function
A = macierz(a, b)
2
%funkcja macierz(a, b) tworzy macierz o a-wierszach
3
% i b-kolumnach
4
for
i = 1:a
5
for
j = 1:b
6
A(i,j) = input(‘Podaj element macierzy: ‘);
7
end
8
end
Pierwsza pętla for jest odpowiedzialna za zmianę numeru wiersza, natomiast druga za
kolumny. Zobaczmy jak wygląda działanie w praktyce tej funkcji:
>>
macierz(2,3)
%2 wiersze, 3 kolumny
Podaj element macierzy: 1
%wpisujemy liczby
Podaj element macierzy: 2
Podaj element macierzy: 3
Podaj element macierzy: 4
- 15 -
Podaj element macierzy: 5
Podaj element macierzy: 6
ans =
1 2 3
4 5 6
>>
Instrukcje oraz operatory przedstawione powyżej stanowią niezbędny element prawie
każdego algorytmu i programu. Z tego też względu należy zwrócić uwagę na poprawne ich
opanowane. Więcej przykładów można znaleźć w literaturze przedstawionej poniżej.
6. Literatura
1.
http://www.mathworks.com
2.
Kuncicky D. C. MATLAB programming, Person Education, Inc, 2004,
3.
Mrozek B., Mrozek Z. MATLAB i Simulink – Poradnik użytkownika, Helion, Warszawa, 2004,
4.
Zalewski A., Cegieła R. MATLAB – obliczenia numeryczne i ich zastosowanie, Wydawnictwo
Nakom, Poznań, 1996,