Starting MATLAB … 2

65
MATLAB The Language of Technical Computing COMPUTATION VISUALIZATION PROGRAMMING (MATLAB Język programowania dla obliczeń technicznych OBLICZENIA WIZUALIZACJA PROGRAMOWANIE) (C) COPYRIGHT 1984 – 1988 by MathWorks, Inc. 1

Transcript of Starting MATLAB … 2

Page 1: Starting MATLAB … 2

MATLABThe Language of Technical Computing

COMPUTATION VISUALIZATION PROGRAMMING

(MATLABJęzyk programowania dla obliczeń technicznych

OBLICZENIA WIZUALIZACJA PROGRAMOWANIE)

(C) COPYRIGHT 1984 – 1988 by MathWorks, Inc.

1

Page 2: Starting MATLAB … 2

Spis treści:

Czym jest MATLAB? System MATLAB Simulink

Czym jest MATLAB?

MATLAB jest wysokowydajnym językiem programowania, przeznaczonym do obliczeń naukowo– inżynierskich. Integruje on obliczenia, wizualizację i programowanie w łatwe do wykorzystania środowisko, w którym stawiane problemy i otrzymywane rozwiązania wyrażane są w dobrze znanej notacji matematycznej. Typowe zastosowania MATLAB-a obejmują:

matematykę i prowadzenie obliczeń opracowanie algorytmów modelowanie, symulację i prototypowanie analizę, eksplorację i wizualizację danych grafikę naukową i techniczną opracowanie aplikacji, włączając w to budowanie graficznego interfejsu użytkownika (ang. Graphical User

Interface)

MATLAB jest interaktywnym systemem, którego podstawowym typem danych jest macierz. Umożliwia to rozwiązywanie wielu technicznych problemów, w szczególności tych sformułowanych przy użyciu macierzy i wektorów, w ułamku czasu potrzebnego do rozwiązania tych samych zagadnień przy użyciu nieinteraktywnych języków, takich C czy Fortran. Nazwa MATLAB jest skrótem od Matrix Laboratory. Pierwotnie MATLAB został stworzony w celu zapewnienia łatwego dostępu do oprogramowania macierzowego, rozwijanego przez projekty LIPACK oraz EISPACK, które razem stanowiły najnowocześniejsze narzędzie służące do obliczeń macierzowych.Z upływem czasu i przy wkładzie wielu użytkowników, MATLAB ewoluował. Na wielu uniwersytetach jest obecnie standardowym narzędziem instruktażowym, wykorzystywanym zarówno we wstępnych, jak i zaawansowanych kursach matematyki i innych nauk ścisłych. W przemyśle, MATLAB jest wykorzystywany jako wysokowydajne narzędzie wspomagające prace badawcze, odkrywcze oraz analizę.MATLAB zawiera rodzinę dodatkowych bibliotek, zwanych przybornikami (ang. toolboxes). Dla większości użytkowników MATLAB-a, bardzo ważny jest fakt, że przyborniki umożliwiają naukę i stosowanie zaawansowanych technologii. Przyborniki są zestawem funkcji MATLAB-a (M-plików), rozszerzającym środowisko o możliwość rozwiązywania określonych, specjalistycznych problemów z dziedziny przetwarzania sygnałów, systemów kontroli, sieci neuronowych, logiki rozmytej, telekomunikacji, symulacji i wielu innych.

System MATLAB

System MATLAB składa się z 5 głównych części:

Język MATLAB-aMATLAB jest językiem programowania wysokiego poziomu, opartym na wykorzystaniu operacji na macierzach i tablicach. Wykorzystuje sterowanie potokiem komend, funkcji, struktur danych, operacji wejścia/wyjścia i jest obiektowo zorientowany. Umożliwia pracę zarówno w trybie interpretera, pozwalając na szybkie tworzenie prostych programów, oraz „programowanie na poważnie” w celu tworzenia dużych i złożonych aplikacji.

Środowisko MATLAB-aJest to zestaw narzędzi, z którymi pracujesz jako użytkownik MATLAB-a lub programista. Umożliwia zarządzanie zmiennymi oraz importowanie i eksportowanie danych. Zawiera również narzędzia do tworzenia (ang. developing), zarządzania (ang. managing), wykrywania błędów (ang. debugging) i optymalizacji (ang. profiling) m-plików oraz aplikacji MATLAB-a.

2

Page 3: Starting MATLAB … 2

System Handle GraphicsTa część MATLAB-a zawiera polecenia wysokiego poziomu, służące do 2- i 3-wymiarowej wizualizacji danych, przetwarzania obrazu, animacji i grafiki prezentacyjnej. Biblioteka funkcji graficznych zawiera również komendy niskiego poziomu, które umożliwiają całkowite dostosowanie grafiki do potrzeb użytkownika oraz budowanie graficznego interfejsu użytkownika (ang. Graphical User Interface), wykorzystywanego w aplikacjach.

Biblioteka funkcji matematycznychJest to rozległy zbiór algorytmów obliczeniowych, obejmujących zarówno funkcje elementarne (suma, sinus, cosinus), jak i bardziej skomplikowane funkcje, takie jak odwracanie macierzy, obliczanie wartości własnych, funkcje Bessela i szybka transformata Fouriera.

Programowy interfejs aplikacji (API)Jest to biblioteka, która pozwala na pisanie programów w języku C lub Fortran. Programy te mogą współdziałać z MATLAB-em. Biblioteka zawiera funkcje umożliwiające wywoływanie programów napisanych w C lub Fortranie z poziomu MATLAB-a, wywoływanie MATLAB-a jako narzędzia obliczeniowego z poziomu C lub Fortrana oraz odczytywanie i zapisywanie MAT-plików.

SimulinkSIMULINK, program towarzyszący MATLAB-owi, jest interaktywnym systemem, służącym do symulacji nieliniowych systemów dynamicznych. Jest to graficzny, obsługiwany za pomocą myszy program, umożliwiający modelowanie systemów poprzez przeciąganie poszczególnych bloków na ekranie i manipulowanie nimi dynamicznie. SIMULINK pozwala na pracę z systemami nieliniowymi, ciągłymi, dyskretnymi i mieszanymi. Z nakładką SIMULINK mogą współpracować dodatkowe elementy (ang. blocksets), będące bibliotekami bloków specjalistycznych aplikacji, związanych z konkretnymi dziedzinami, takimi jak komunikacja, przetwarzanie obrazu i wieloma innymi.Real-time Workshop jest programem umożliwiającym generowanie kodu C na bazie utworzonych diagramów bloków i uruchamianie go na różnych systemach czasu rzeczywistego.

Macierze i Magiczne KwadratyNajlepszym sposobem na rozpoczęcie pracy z MATLAB-em jest nauczenie się obchodzenia z macierzami. Ten rozdział wyjaśni Ci jak to się robi. W MATLAB-ie, macierz jest prostokątną tablicą liczb. Szczególne znaczenie mają macierze 1 na 1, które są skalarami i posiadające jeden wiersz lub kolumnę, które są wektorami. Wprawdzie MATLAB wykorzystuje inne metody przechowywania danych numerycznych i nienumerycznych, jednak na początku najlepiej wszystko traktować jako macierz. Wszelkie operacje wykonywane w MATLAB-ie zostały tak zaprojektowane, aby być jak najbardziej naturalne. Tam gdzie inne języki programowania działają na liczbach, MATLAB pozwala na szybką i łatwą pracę z całymi macierzami.

3

Page 4: Starting MATLAB … 2

Dobry przykład macierzy znajduje się na tej renesansowej rycinie, którą wykonał niemiecki artysta i zarazem matematyk – amator, Albrecht Durer. Obraz ten jest przepełniony matematyczną symboliką. Jeśli przyjrzysz się uważnie, w prawym górnym rogu zauważysz macierz. Macierz ta jest znana jako magiczny kwadrat i w czasach Durer’a wierzono, że posiadała magiczne właściwości.

Wpisywanie Macierzy

W MATLAB-ie możesz wpisywać macierze na wiele różnych sposobów. Oto one:

• Wpisywanie listy elementów.• Ładowanie macierzy z zewnętrznych plików.• Generowanie macierzy przy użyciu wbudowanych funkcji.• Tworzenie macierzy przy użyciu Twoich własnych funkcji zapisanych w M-plikach.

4

Page 5: Starting MATLAB … 2

Rozpocznij od wpisania macierzy Durer’a jako listy jej elementów. Musisz tylko pamiętać o kilku podstawowych zasadach:

• Oddzielaj elementy wiersza znakami spacji lub przecinkami.• Używaj średnika do oznaczania końca każdego wiersza.• Ujmuj całą listę elementów w nawiasy kwadratowe.

Aby wprowadzić macierz Durer’a, po prostu napisz:

A = [16 3 2 13; 5 10 11 8;9 6 7 12; 4 15 14 1]

MATLAB wyświetli macierz, którą właśnie wpisałeś,

A =16 3 2 135 10 11 89 6 7 124 15 14 1

Numery są zgodne z tymi na rycinie. Kiedy wprowadziłeś macierz, MATLAB automatycznie ją zapamiętał. Możesz się do niej odwoływać poprzez zmienną A. Teraz, gdy masz już zapamiętaną macierz A, przekonasz się dlaczego jest ona taka interesująca. Dlaczego jest magiczna?

Funkcje sum, transpose oraz diag

Pewnie domyślasz się, że specjalne właściwości magicznego kwadratu mają coś wspólnego z różnymi możliwościami sumowania jego elementów. Jeśli dodasz do siebie wszystkie liczby z dowolnego wiersza lub kolumny, czy też z jednej z dwóch głównych przekątnych, otrzymasz zawsze ten sam wynik. Sprawdźmy to w MATLAB-ie. Najpierw spróbuj poniższego zapisu:

sum(A)

MATLAB odpowie

ans = 34 34 34 34

Jeśli nie określisz zmiennej wyjściowej, MATLAB używa do przechowywania rezultatów obliczeń zmiennej ans (skrót od answer - odpowiedź). Uzyskałeś wektor składający się z sum kolumn macierzy A. Okazało się, że każda suma jest identyczna, jest to magiczna suma.

Co powiesz na zsumowanie wierszy? MATLAB woli pracować z kolumnami macierzy, więc najłatwiejszym sposobem uzyskania sum wierszy jest transpozycja macierzy, zsumowanie kolumn i transpozycja wyniku. Operacja transpozycji jest oznaczana apostrofem. Operacja ta odwraca macierz według jej głównej przekątnej i zamienia wektory wierszy w wektory kolumn. Wobec tego wpisując

A'

uzyskasz

ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 6 12 1

Natomiast zapis

sum(A')'

da Ci wektor w postaci kolumny, zawierający sumy wierszy

5

Page 6: Starting MATLAB … 2

ans = 34 34 34 34

Sumę elementów znajdujących się na głównej przekątnej macierzy, można łatwo otrzymać dzięki funkcji diag, która pozyskuje elementy z głównej przekątnej.

diag(A)

daje

ans = 16 10 7 1

natomiast

sum(diag(A))

zwraca ans = 34

Druga przekątna nie jest tak istotna z matematycznego punktu widzenia, więc MATLAB nie posiada żadnej funkcji bezpośrednio na niej operującej. Jednak funkcja fliplr, zaprojektowania do użycia przy obsłudze grafiki, odpowiednio odwróci macierz.

sum(diag(fliplr(A))) ans = 34

Przekonaliśmy się, że macierz pochodząca z ryciny Durer’a faktycznie jest magicznym kwadratem, a przy okazji poznaliśmy kilka funkcji MATLAB-a służących do operowania na macierzach. Wykorzystamy tą macierz w dalszych rozdziałach aby zilustrować dodatkowe możliwości MATLAB-a.

Indeksy

Element leżący na przecięciu i-tej kolumny i j-tego wiersza jest oznaczany jako A (i,j). Na przykład A (4,2) jest liczbą leżącą w miejscu przecięcia czwartego wiersza i drugiej kolumny. Dla naszego magicznego kwadratu A (4,2) równe jest 15. Możemy więc obliczyć sumę elementów znajdujących się w czwartej kolumnie macierzy A, wpisując

A(1,4) + A(2,4) + A(3,4) + A(4,4)

Jako wynik otrzymamy

ans = 34

nie jest to jednak najbardziej elegancki sposób na zsumowanie pojedynczej kolumny.

Możliwe jest odwołanie się do elementów macierzy przy użyciu jednego tylko indeksu, A (k). W ten sposób zwykle odwołujemy się do wektorów. Można jednak ten sposób zastosować również do dwuwymiarowej macierzy, jednak w takim przypadku tablica jest traktowana jako wektor, będący jedną, długą kolumną, utworzoną z kolumn oryginalnej macierzy. I tak dla naszego, magicznego kwadratu, A (8) jest kolejnym sposobem odwołania się do wartości przechowywanej w A (4,2).Jeśli spróbujesz użyć indeksu leżącego poza macierzą, wystąpi błąd:

t = A(4,5)

6

Page 7: Starting MATLAB … 2

Index exceeds matrix dimensions.

Z drugiej strony, jeśli zapiszesz nową wartość w elemencie spoza macierzy, jej rozmiar zwiększy się: X = A; X(4,5) = 17

X = 16 3 2 13 0 5 10 11 8 0 9 6 7 12 0 4 15 14 1 17

Operator Dwukropek

Operator dwukropek, : , to jeden z najważniejszych operatorów stosowanych w MATLAB-ie. Występuje w kilku różnych formach. Wyrażenie

1:10

oznacza wektor zawierający liczby całkowite od 1 do 10

1 2 3 4 5 6 7 8 9 10

Aby następny element zwiększał się o wartość inną od 1, możesz określić przyrost. Przykładowo:

100:-7:50

to 100 93 86 79 72 65 58 51

natomiast

O:pi/4:pi

to

0 0.7854 1.5708 2.3562 3.1416

W wyrażeniach indeksowych wykorzystujemy dwukropek aby odwoływać się do wybranych elementów macierzy. A(1:k,J)

oznacza k pierwszych elementów znajdujących się w j-tej kolumnie. Czyli sum(A(1:4,4))

obliczy nam sumę elementów z czwartej kolumny. Istnieje jednak lepszy sposób. Sam dwukropek oznacza wszystkie elementy wiersza lub kolumny macierzy, natomiast słowo kluczowe end, oznacza ostatni wiersz lub ostatnią kolumnę. Zatem sum(A(:,end))

obliczy sumę elementów ostatniej kolumny macierzy A.

ans = 34

7

Page 8: Starting MATLAB … 2

Dlaczego magiczna suma dla macierzy 4 na 4 jest równa 34? Jeśli liczby całkowite od 1 do 16 zostaną umieszczone w czterech grupach o równych sumach, to ich suma musi równać się sum(1:16)/4

co oczywiście daje ans = 34

Funkcja magic

MATLAB posiada funkcję, która pozwala na tworzenie magicznych kwadratów o prawie każdym rozmiarze. Jest to funkcja magic.

B = magic(4)

B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1

Macierz ta jest prawie taka sama, jak ta z ryciny Durer’a i ma te same „magiczne” właściwości. Macierze różnią się tylko tym, że dwie środkowe kolumny są zamienione. Aby utworzyć z B, macierz A Durer’a, zamień dwie środkowe kolumny.

A = B(:,[1 3 2 4])

Zapis ten oznacza „dla każdego rzędu macierzy B, zapisz elementy w kolejności 1, 3, 2, 4”. Daje nam to

A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

Dlaczego Durer zamienił miejscami te kolumny? Bez wątpienia, chciał zapisać w ten sposób datę powstania swego dzieła – rok 1514, w ostatnim wierszu magicznego kwadratu.

Wyrażenia

Jak większość innych języków programowania, MATLAB udostępnia wyrażenia matematyczne, jednak w przeciwieństwie do innych języków, w MATLAB-ie pracujemy z całymi macierzami. Wyróżniamy następujące rodzaje wyrażeń:

• Zmienne • Liczby • Operatory • Funkcje

Zmienne

MATLAB nie wymaga deklarowania wymiarów zmiennych. Kiedy podajesz nową nazwę zmiennej, MATLAB automatycznie tworzy ją i alokuje dla niej odpowiednią ilość miejsca. Jeśli zmienna już istnieje, MATLAB zmienia jej zawartość i jeśli trzeba alokuje nowe miejsce. Na przykład

num_students = 25

8

Page 9: Starting MATLAB … 2

tworzy macierz 1 na 1 o nazwie num_students i zapisuje w jej jedynym elemencie wartość 25. Nazwa zmiennej składa się z litery, po której mogą wystąpić liczby, podkreślenia i inne litery. MATLAB bierze pod uwagę tylko pierwszych 31 znaków z nazwy zmiennej. MATLAB rozróżnia wielkość liter, co oznacza, że A oraz a nie są tą samą zmienną. Aby zobaczyć macierz przyporządkowaną do danej zmiennej, po prostu wpisz nazwę tej zmiennej.

Liczby

MATLAB używa konwencjonalnej notacji dziesiętnej z opcjonalnym przecinkiem oraz znakami plus i minus. Notacja naukowa wykorzystuje literę e jako mnożnik „do potęgi dziesiątej”. Przy korzystaniu z liczb urojonych używa się przedrostka i lub j. Oto przykłady poprawnie zapisanych liczb:

3 -99 0.0001 9.6397238 1.60210e-20 6.02252e23 1i -3.14159j 3e5i

Wszystkie liczby są przechowywane w formacie long, zgodnym ze standardem ustanowionym przez IEEE. Liczny zmiennoprzecinkowe mają dokładność ograniczoną do 16 znaczących miejsc po przecinku i mogą należeć do przedziału od 10-308 do 10+308.

Operatory

W wyrażeniach używamy znanych operatorów arytmetycznych oraz kolejności działań.

+ Dodawanie - Oodejmowanie* Mnożenie/ Dzielenie\ Lewostronne dzielenie (opisane w rozdziale Macierze i Algebra Liniowa w MATLAB-ie)^ Potęga' Transpozycja liczb zespolonych( ) Określa kolejność wykonywania działań

Funkcje

MATLAB udostępnia wiele standardowych, elementarnych funkcji matematycznych, takich jak abs (wartość bezwzględna), sqrt (pierwiastek kwadratowy), exp (e do potęgi), czy sin (sinus). Próba obliczenia pierwiastka kwadratowego z liczby ujemnej nie spowoduje błędu, ponieważ MATLAB automatycznie wygeneruje wynik w postaci zespolonej. MATLAB zawiera również wiele znacznie bardziej zaawansowanych funkcji matematycznych, włącznie z funkcjami Bessela oraz gamma. Z większością tych funkcji można stosować liczby zespolone. Aby uzyskać pełną listę elementarnych funkcji matematycznych, wpisz

help elfun

Listę bardziej zaawansowanych funkcji możesz obejrzeć wpisując

help elmat

Niektóre funkcje, jak na przykład sqrt i sin, są wbudowane. Są one częścią jądra MATLAb-a co czyni je bardzo wydajnymi, jednak z drugiej strony sprawia, że szczegóły ich działania nie są łatwo dostępne. Inne funkcje, jak gamma lub sink, są zaimplementowane w M-plikach. Możesz oglądać ich kod źródłowy i modyfikować go wedle uznania.

Niektóre funkcje specjalne udostępniają wartości użytecznych stałych.

pi 3.14159265... i, j Jednostka urojona, eps Precyzja liczb zmiennoprzecinkowych, 2-52

realmin Najmniejsza liczba zmiennoprzecinkowa, 2-1022

9

Page 10: Starting MATLAB … 2

realmax Największa liczba zmiennoprzecinkowa, (2-)-1023 Inf NieskończonośćNaN Nie-liczba (ang. Not-a-number)Nieskończoność jest generowana, na przykład przy dzieleniu niezerowej wartości przez zero lub rozwiązywaniu równań matematycznych, których wyniki przekraczają dozwolony zakres.

Nie-liczba jest generowana przy próbie rozwiązania wyrażeń takich jak 0/0 lub Inf-Inf, czyli wyrażeń, które nie mają zdefiniowanych wartości matematycznych.

Nazwy funkcji nie są zarezerwowane. Możesz każdą z nich nadpisać dowolną, nową zmienną, na przykład

eps = 1.e-6

i używać tej zmiennej w dalszych obliczeniach. Oryginalna funkcja zostanie przywrócona po wpisaniu

clear eps

Wyrażenia

Oto kolejne przykłady wyrażeń stosowanych w MATLAB-ie, wraz z wynikami.

rho = (1+sqrt(5))/2 rho =

1.6180

a = abs(3+4i) a = 5 z = sqrt(besselk(4/3,rho-i)) z = 0.3730+ 0.32141

huge = exp(log(realmax)) huge =

1.7977e+308 toobig = pi*huge toobig =

Inf

Praca z Macierzami

Ten rozdział wprowadzi Cię w inne sposoby tworzenia macierzy.

Generowanie Macierzy

MATLAB udostępnia cztery funkcje generujące podstawowe macierze:

zeros Macierz składająca się z samych zer ones Macierz składająca się z samych jedynek rand Macierz składająca się z elementów losowychrandn Macierz składająca się z elementów losowych (normalna dystrybuanta)

Oto kilka przykładów:

Z = zeros(2,4) Z = 0 0 0 0

10

Page 11: Starting MATLAB … 2

0 0 0 0

F = 5*ones(3,3) F = 5 5 5 5 5 5 5 5 5

N = fix(10*rand(1,10)) N = 4 9 4 4 8 5 2 6 8 0

R = randn(4,4) R =

1.0668 0.2944 -0.6918 -1.4410 0.0593 -1.3362 0.8580 0.5711 -0.0956 0.7143 1.2540 -0.3999 -0.8323 1.6236 -1.5937 0.6900

load

Komenda load odczytuje pliki binarne, zawierające macierze wygenerowane wcześniej podczas pracy z MATLAB-em lub pliki tekstowe zawierające dane numeryczne. Plik tekstowy powinien być zorganizowany jako prostokątna tabela liczb oddzielonych spacjami, zawierająca jeden wiersz w linii i taką sama ilość elementów w każdym wierszu. Przykładowo, utwórz poza MATLAB-em plik tekstowy, zawierający cztery poniższe linie:

16.0 3.0 2.0 13.0 5.0 10.0 11.0 8.0 9.0 6.0 7.0 12.0 4.0 15.0 14.0 1.0

Zapisz plik pod nazwą magik.dat. Następnie wpisz komendę load magik.dat

co spowoduje odczytanie pliku oraz utworzenie zmiennej magik, zawierającej naszą przykładową macierz.

M-pliki

Możesz także tworzyć własne macierze używając M-plików, które są plikami tekstowymi, zawierającymi kod MATLAB-a. Po prostu utwórz plik zawierający taką samą składnię, jakiej używasz w MATLAB-ie i zapisz ten plik nadając mu rozszerzenie .m.

UWAGA Aby uzyskać dostęp do edytora tekstu na swoim komputerze, wybierz Otwórz (Open) lub Nowy (New) z menu Plik (File), ewentualnie naciśnij odpowiedni przycisk na pasku narzędzi. Aby uzyskać dostęp do edytora tekstowego w systemie UNIX, użyj symbolu ! a po nim wpisz normalnie używaną komendę.

Dla przykładu, utwórz plik zawierający poniższych 5 linii:

A = [ ... 16.0 3.0 2.0 13.0 5.0 10.0 11.0 6.0 9.0 6.0 7.0 12.0 4.0 15.0 14.0 1.0 ];

Zapisz plik pod nazwą magik.m. Wpisanie w MATLAB-ie nazwy tego pliku, czyli magik, spowoduje odczytanie go i utworzenie zmiennej A, zawierającej zapisaną w pliku macierz.

11

Page 12: Starting MATLAB … 2

Łączenie macierzy (ang. Concatenation)

Jest to proces polegający na łączeniu małych macierzy w celu utworzenia większych. Pierwsza stworzona przez Ciebie macierz powstała w rzeczywistości poprzez połączenie jej elementów. Operator łączenia to para kwadratowych nawiasów, [ ]. Wykorzystaj więc nasz magiczny kwadrat o rozmiarach 4 na 4 , czyli macierz A i napisz

B = [A A+32; A+48 A+16]

Otrzymasz macierz 8 na 8, powstałą z połączenia czterech podmacierzy.

B = 16 3 2 13 48 35 34 45 5 10 11 5 37 42 43 40 9 6 7 12 41 38 39 44 4 15 14 1 36 47 46 33 64 51 50 61 32 19 18 29 53 58 59 56 21 26 27 24 57 54 55 60 25 22 23 28 52 63 62 49 20 31 30 17

Macierz ta jest już w połowie magicznym kwadratem. Jej elementy to liczby całkowite z zakresu od 1 do 64. Sumy kolumn są prawidłowe:

sum(B)

ans = 260 260 260 260 260 260 260 260

Jednak dodanie do siebie elementów poszczególnych wierszy, sum(B’)’ nie da takiego samego wyniku. Aby macierz B stała się w pełni magicznym kwadratem o rozmiarze 8 na 8, trzeba dokonać jeszcze kilku zmian.

Usuwanie Rzędów i Kolumn

Możesz usuwać rzędy i kolumny macierzy, używając pary kwadratowych nawiasów. Na początek wpisz

X = A;

Następnie, aby usunąć drugą kolumnę macierzy X, wpisz

x(:, 2) = [ ]

Macierz X wygląda teraz następująco

X = 16 2 13 5 11 8 9 7 12 4 14 1

Jeśli usuniesz z macierzy pojedynczy element, nie będzie ona już macierzą. Wyrażenia takie jak

X(1,2) = []

wywołają błąd. Jednak użycie jednego tylko indeksu usuwa jeden element lub ich sekwencję oraz zamienia pozostałe elementy w wektor. Czyli

X(2:2:10) = []

daje

X =

12

Page 13: Starting MATLAB … 2

16 9 2 7 13 12 1

Okno Poleceń (ang. Command Window)

Do tej pory, wpisywaliśmy komendy oraz wyrażenia i obserwowaliśmy wyniki naszych działań, stosując linię poleceń (ang. command line) MATLAB-a. W tym rozdziale poznasz kilka sposobów na zmianę wyglądu okna poleceń. Jeśli Twój system pozwala na wybór czcionek okna poleceń, zalecamy stosowanie czcionek Fixedsys lub Courier, co zapewni zachowanie odpowiednich odstępów między znakami.

Komenda format

Komenda ta kontroluje numeryczny format wartości wyświetlanych przez MATLAB-a. Wpływa ona tylko na sposób wyświetlania liczb a nie na to, jak MATLAB je przetwarza i przechowuje. Oto różne formaty, wraz z rezultatami ich zastosowania:

x = [4/3 1.2345e-6] format short

1.3333 0.0000

format short e

1.3333e+000 1.2345e-006

format short g

1.3333 1.2345e-006

format long

1.33333333333333 0.00000123450000 format long e

1.333333333333333e+000 1.234500000000000e-006

format long g

1.33333333333333 1.2345e-006

format bank

1.33 0.00

format rat

4/3 1/810045 format hex

3ff5555555555555 3eb4b6231abfd271

Jeśli największy element macierzy jest większy od 103 lub mniejszy od 10-3, MATLAB stosuje jednakową skalę dla formatów short i long. Istnieje jeszcze dodatkowa komenda

format compact

która ukrywa puste linie pojawiające się na wyjściu. Pozwoli Ci ona widzieć więcej informacji na jednym ekranie. Jeśli chcesz bardziej kontrolować format wyjściowy, użyj funkcji sprintf oraz fprintf.

13

Page 14: Starting MATLAB … 2

Ukrywanie Wyjścia

Gdy wpiszesz polecenie i naciśniesz klawisz Return lub Enter, MATLAB automatycznie wyświetli rezultat na ekranie. Jednak jeśli zakończysz wpis średnikiem, MATLAB dokona obliczeń lecz nie wyświetli żadnego wyniku. Jest to szczególnie użyteczne podczas generowania dużych macierzy, na przykład

A = magic(100);

Długie Linie Poleceń

Jeśli wprowadzane przez Ciebie polecenia nie mieszczą się w jednej linii, użyj trzech kropek, ... , i naciśnij Return lub Enter. Oznacza to, że wyrażenie będzie kontynuowane w następnej linii. Na przykład: s = 1 -1/2 + 1/3 -1/4 + 1/5 - 1/6 + 1/7 ... - 1/8 + 1/9 - 1/10 + 1/11 - 1/12;

Spacje przy znakach =, + oraz – są opcjonalne, jednak znacznie zwiększają czytelność zapisu.

Edycja Linii Poleceń

Różne klawisze znajdujące się na klawiaturze umożliwiają przywołanie, edycję i powtórne użycie wpisanych wcześniej komend. Dla przykładu załóżmy, że błędnie wpisana została następująca linia

rho = (1 + sqt(5))/2

Popełniliśmy błąd przy wpisywaniu sqrt, więc MATLAB poinformuje nas o tym Undefined function or variable 'sqt'

Zamiast wpisywać ponownie całą linię, wystarczy użyć klawisza . Błędna komenda zostanie wyświetlona. Używając klawisza możesz przesunąć kursor w lewo i wpisać brakującą literę r. Ponowne wciskanie klawisza spowoduje wyświetlenie wcześniej wpisanych komend. Jeśli wpiszesz kilka znaków, po czym naciśniesz klawisz , MATLAB odnajdzie poprzednio wprowadzoną linię rozpoczynającą się od tych znaków.

Lista dostępnych klawiszy edycyjnych może być zależna od Twojego komputera. Poeksperymentuj aby przekonać się, które z poniższych klawiszy działają na używanym przez Ciebie systemie. (Duża część tych klawiszy będzie znana użytkownikom edytora EMACS).

ctrl-p Przywołuje poprzednią linię ctrl-n Przywołuje następną linię ctrl-b Przesuwa kursor w lewo o jeden znak ctrl-f Przesuwa kursor w prawo o jeden znakctrl - ct rl-r Przesuwa kursor w prawo o jedno słowoctrl - ctrl-l Przesuwa kursor w lewo o jedno słowohome ctrl-a Przesuwa kursor na początek linii end ctrl-e Przesuwa kursor na koniec liniiesc ctrl-a Czyści całą liniędel ctrl-d Usuwa znak po prawej stronie kursorabackspace ctrl-h Usuwa znak po lewej stronie kursora ctrl-k Usuwa znaki od kursora do końca linii

Grafika

14

Page 15: Starting MATLAB … 2

MATLAB posiada rozbudowane możliwości wyświetlania wektorów i macierzy w postaci graficznej, jak również wykonywania opisów i drukowania grafiki. Ten rozdział zaprezentuje Ci kilka najistotniejszych funkcji graficznych oraz pokaże przykłady ich typowych zastosowań.

Tworzenie Wykresu (Funkcja plot)

Funkcja plot może przyjmować różne formy, w zależności od argumentów wejściowych. Jeśli y jest wektorem, plot(y) utworzy liniowy graf przedstawiający wartości elementów wektora y na jednej osi, natomiast na drugiej osi ukazane zostaną indeksy poszczególnych elementów wektora. Jeżeli jako argumenty funkcji plot podasz dwa wektory x i y, komenda plot(x , y) utworzy wykres wektora y względem wektora x.

Na przykład, aby wykreślić wartość funkcji sinus od zera do 2, napisz

t = O:pi/100:2*pi; y = sin(t); plot(t,y)

Podanie wielu par x-y umożliwia utworzenie wielu wykresów przy jednym wywołaniu funkcji plot. MATLAB automatycznie dobiera kolor dla każdego zestawu danych (użytkownik może to jednak zrobić samodzielnie). Na przykład, poniższy zapis kreśli trzy pokrewne funkcje t, każdą w innym, wyróżniającym się kolorze.

y2 = sin(t-.25); y3 = sin(t-.5); plot(t,y,t,y2,t,y3)

15

Page 16: Starting MATLAB … 2

Możliwy jest wybór koloru, stylu linii oraz znaczników takich jak znaki plus lub okręgi

plot(x,y,'kolor_styl_znacznik')

kolor_styl_znacznik to jedno-, dwu- lub trójznakowy ciąg (ujęty w cudzysłów), składający się z koloru, stylu linii oraz rodzaju znacznika:

Znaki określające kolor to 'c' , 'm' , 'y' , 'r' , 'g' , 'b' , 'w' , oraz 'k' . Odpowiedzialne są one za kolory: cyjan, magneta, żółty (ang. yellow), czerwony (ang. red), zielony (ang. green), niebieski (ang. blue), biały (ang. white) oraz czarny (ang. black).

Znaki określające styl linii to: ‘-‘ dla linii ciągłej, ‘--’ dla linii kreskowanej, ‘:’ dla linii kropkowanej, ‘-.’ dla linii typu kreska-kropka oraz ‘brak’ – bez linii.

Najczęściej stosowane typy znaczników to: ‘+’ , ‘o’ , ‘*’ oraz ‘x’ .

Dla przykładu

plot(x,y,'y:+')

wykreśli żółtą linię kropkowaną, ze znacznikami w postaci symboli plus w miejscu każdego przecięcia się danych. Jeśli wybierzesz rodzaj znacznika, lecz nie uwzględnisz stylu linii, MATLAB wykreśli tylko znaczniki.

Okna Graficzne (ang. Figure Windows)

Funkcja plot, automatycznie otwiera nowe okno, jeśli na ekranie nie ma otwartych okien graficznych. Jeśli takie okno już istnieje, zostanie domyślnie użyte. Aby otworzyć nowe okno graficzne i uczynić je bieżącym, wpisz

figure

Aby uczynić istniejące okno bieżącym, wpisz figure(n)

gdzie n jest numerem okna, który możesz znaleźć na pasku tytułowym. Rezultaty używanych później funkcji graficznych będą wyświetlane w tym oknie.

Dodawanie Krzywych do Istniejących Wykresów

16

Page 17: Starting MATLAB … 2

Komenda hold umożliwia dodawanie krzywych do istniejących już wykresów. Gdy wpiszesz

hold on

MATLAB nie usunie istniejącego wykresu, lecz doda do niego nowe dane i jeśli będzie to konieczne, przeskaluje wykres. Dla przykładu, poniższy zapis tworzy konturowy wykres wierzchołków funkcji, a następnie nakłada pseudo-kolorowy wykres tej samej funkcji:

[x,y,z] = peaks; contour(x,y,z,20,'k') hold on pcolor(x,y,z) shading interp

Komenda hold on sprawia, że wykres pcolor jest łączony z wykresem contour.

Komenda subplot

Komenda subplot pozwala na wyświetlanie wielu wykresów w tym samym oknie lub na drukowanie ich na jednej kartce papieru. Wpisanie

subplot(m,n,p)

spowoduje przekształcenie okna graficznego w macierz o wymiarach m na n, składającą się z małych wykresów. Jako bieżący zostanie ustawiony wykres o numerze p. Wykresy są ponumerowane rzędami. Aby wykreślić dane w czterech różnych regionach okna graficznego, wpisz

t = O:pi/10:2*pi; [X,Y,Z] = cylinder(4*cos(t)); subplot(2,2,1) mesh(X) subplot(2,2,2); mesh(Y) subplat(2,2,3); mesh(Z) subplot(2,2,4); mesh(X,Y,Z)

17

Page 18: Starting MATLAB … 2

Dane Urojone i Zespolone

Gdy argumenty funkcji plot są zespolone, część urojona jest ignorowana, z wyjątkiem przypadku podania pojedynczego argumentu zespolonego. W takim przypadku, komenda powoduje wykreślenie części rzeczywistej w funkcji części urojonej. Zatem zapis

plot(Z)

gdzie Z jest zespolonym wektorem lub macierzą, jest równoznaczny zapisowi

plot(real(Z),imag(Z))

Na przykład

t = O:pi/10:2*pi; plot(exp(i*t),'-o')

kreśli wielobok o 20 ścianach wraz ze znacznikami w postaci okręgów

18

Page 19: Starting MATLAB … 2

Kontrolowanie Osi

Funkcja axis posiada wiele opcji służących do dopasowywania, skalowania, orientowania wykresów oraz ustawiania ich proporcji.

MATLAB automatycznie odnajduje maksima i minima danych i dobiera odpowiednią skalę oraz opis osi. Funkcja axis pozwala zastąpić domyślne ustawienia własnymi, poprzez dobór limitów osi

axis([xmin xmax ymin ymax])

Funkcja axis akceptuje również kilka słów kluczowych. Na przykład

axis square

sprawia, że obie osie maja taką samą długość, natomiast

axis equal

sprawia, że znaczniki na obu osiach zmieniają się w równych odstępach. Zatem zapis

plot(exp(i*t))

poprzedzony funkcją axis square lub axis equal zmieni owal będący wynikiem powyższego wyrażenia w okrąg.

axis auto

przywraca tryb automatyczny skalowania osi.

axis on

włącza opisy osi oraz miejsc wystąpienia znaczników.

axis off

wyłącza opisy osi oraz miejsc wystąpienia znaczników.

Funkcja

grid off

wyłącza wyświetlanie linii siatki, natomiast

grid on

włącza siatkę z powrotem.

Etykiety Osi i Tytuły

Funkcje xlabel, ylabel oraz zlabel nadają etykiety osiom x, y oraz z, funkcja title dodaje tytuł wykresu w górnej części okna, natomiast funkcja text umieszcza dowolny tekst w dowolnym miejscu okna graficznego. Podzbiór notacji Tex zawiera litery greckie, symbole matematyczne oraz alternatywne czcionki. W poniższym przykładzie \leq oznacza , \pi oznacza , natomiast \it oznacza kursywę (ang. italic).

t = -pi:pi/100:pi;y = sin(t);plot(t,y)axis([-pi pi -1 1])xlabel('-\pi \leq {\itt} \leq \pi') ylabel('sin(t)')

19

Page 20: Starting MATLAB … 2

title('Graph of the sine function') text(1,-1/3,'\it{Note the odd symmetry.}')

Funkcje mesh oraz surf

MATLAB definiuje powierzchnię poprzez współrzędne ‘z’ punktów, znajdujących się ponad płaszczyzną x-y, używając linii prostych do łączenia sąsiednich punktów. Funkcje mesh i surf wyświetlają powierzchnie w trzech wymiarach. Mesh wyświetla powierzchnie w postaci siatek, w których pokryte kolorem są tylko linie, natomiast surf pokazuje w kolorze zarówno linie jak i poszczególne ścianki powierzchni.

Wizualizacja Funkcji Dwóch Zmiennych

Aby wyświetlić funkcję dwóch zmiennych, z = f(x,y), wygeneruj macierze X i Y, składające się z powtórzonych rzędów i kolumn, odpowiednio dla całej dziedziny funkcji. Następnie użyj tych macierzy do rozwiązania i wykreślenia funkcji. Funkcja meshgrid przekształca dziedzinę określoną przez wektor lub dwa wektory x i y, w macierze X oraz Y, których możemy użyć do rozwiązania funkcji dwóch zmiennych. Wiersze macierzy X są kopiami wektora x, natomiast kolumny macierzy Y to kopie wektora y.

[X,Y] = meshgrid(-8:.5:8); R = sqrt(X.^2 + Y.^2) + eps; Z = sin(R)./R; mesh(X,Y,Z)

20

Page 21: Starting MATLAB … 2

W tym przykładzie, R jest odległością od początku układu współrzędnych, który jest również środkiem macierzy. Dodanie wartości eps zapobiega dzieleniu 0/0 w środku układu współrzędnych.

Obrazy

Dwuwymiarowe macierze mogą być wyświetlane jako obrazy, w których wartości elementów macierzy określają jasność i kolor. Na przykład

load durer whos

pokazuje, że plik durer.mat zawiera macierz X o wymiarach 648 na 509 oraz macierz map o wymiarach 128 na 3. Elementy macierzy X są liczbami całkowitymi z zakresu od 1 do 128, które wskazują na elementy mapy kolorów (map). Następujący zapis

image(X) colormap(map) axis image

reprodukuje rycinę Durer’a, którą pokazano na początku tej książki. Obraz przedstawiający magiczny kwadrat jest zapisany w innym pliku. Wpisz

load detail

po czym użyj klawisza na klawiaturze aby uruchomić raz jeszcze komendy image, colormap oraz axis.

Komenda

colormap(hot)

doda rycinie z XVI wieku nowoczesnych kolorów.

Drukowanie Grafiki

Aby wydrukować zawartość okna graficznego MATLAB-a, możesz użyć opcji Print z menu File lub komendy print. Menu Print otwiera okno dialogowe, które pozwala na wybór standardowych opcji drukowania. Komenda print daje znacznie większą elastyczność w doborze typu wyjścia, a ponadto umożliwia kontrolę drukowania M-plików.

21

Page 22: Starting MATLAB … 2

Zawartość okna graficznego może być wysłana bezpośrednio do drukarki, jednak można ją także zapisać w pliku. MATLAB udostępnia bardzo szeroki zestaw formatów wyjściowych, włącznie z formatem PostScript.

Poniższa komenda zapisuje zawartość bieżącego okna graficznego jako kolorowy PostScript poziomu 2, w pliku o nazwie magicsquare.eps:

print -depsc2 magicsquare.eps

Przed użyciem polecenia print, należy zapoznać się z parametrami używanej drukarki. Na przykład, pliki w formacie PostScript poziomu 2, są generalnie mniejsze i renderują się dużo szybciej podczas drukowania, niż pliki zapisane w formacie PostScript poziomu 1. Jednak nie wszystkie drukarki obsługują PostScript poziomu 2, musisz więc wiedzieć z czym Twój sprzęt może sobie poradzić. Linie i tekst drukowane są jako czarne lub białe.

Pomoc i Dokumentacja Online

Istnieje kilka sposobów uzyskania informacji o funkcjach MATLAB-a.

Komenda help Okno pomocy Help Desk MATLAB-a Instrukcje Online Odnośnik do witryny internetowej firmy MathWorks, Inc.

Komenda help

Komenda help jest podstawowym sposobem uzyskania pomocy na temat składni i zachowania konkretnej funkcji. Informacje te są wyświetlane bezpośrednio w oknie poleceń. Na przykład komenda

help magic

wyświetla: MAGIC Magic square. MAGIC(N) is an N-by-N matrix constructed from the integers 1 through N^2 with equal row, column, and diagonal sums. Produces valid magic squares for N = 1,3,4,5....

UWAGA Informacje zapisane w pomocy MATLAB-a wykorzystują wielkie litery w nazwach funkcji i zmiennych aby wyróżnić je w tekście. Jednak kiedy wpisujesz nazwy funkcji, zawsze używaj małych liter, gdyż MATLAB rozróżnia ich wielkość a wszystkie nazwy funkcji w rzeczywistości zapisane są małymi literami.

Wszystkie funkcje MATLAB-a są zorganizowane w logicznych grupach. Bazuje na nich również struktura katalogów MATLAB-a. Na przykład, wszystkie funkcje dotyczące algebry liniowej znajdują się w katalogu matfun. Aby wyświetlić ich listę wraz z krótkimi opisami, wpisz

help matfun

Matrix functions - numerical linear algebra.

Matrix analysis.norm - Matrix or vector norm. normest - Estimate the matrix 2-norm

Wpisanie samej komendy

help

spowoduje wyświetlenie listy wszystkich katalogów, wraz z opisem kategorii do jakich należą funkcje w nich zawarte:

matlab/general

22

Page 23: Starting MATLAB … 2

matlab/ops...

Okno Pomocy

Na komputerach PC okno pomocy MATLAB-a jest dostępne poprzez opcję Help Window, znajdującą się w menu Help lub poprzez kliknięcie na symbolu znaku zapytania, który znajduje się na pasku narzędzi. Na wszystkich typach komputerów, dostęp do okna pomocy można uzyskać wpisując

helpwin

Aby użyć okna pomocy do konkretnego tematu, wpisz helpwin temat

Okno pomocy daje Ci dostęp do tych samych informacji co komenda help, jednak interfejs okienkowy wyposażony jest w wygodne odnośniki do innych tematów.

Komenda lookfor

Komenda lookfor umożliwia wyszukiwanie funkcji na bazie słów kluczowych. Komenda ta szuka tych słów w pierwszej linii tekstu pomocy (która zwana jest linią H1) i zwraca linie zawierające wyszczególnione przez użytkownika słowo kluczowe. Na przykład, MATLAB nie posiada funkcji o nazwie inverse, więc odpowiedzią na komendę

help inverse

będzie inverse.m not found.

Jednak lookfor inverse

odnajdzie tuzin pasujących słów. W zależności od zainstalowanych przyborników, odpowiedź może wyglądać następująco:

INVHILB Inverse Hilbert matrix. ACOSH Inverse hyperbolic cosine. ERFINV Inverse of the error function. INV Matrix inverse.PINV Pseudoinverse.IFFT Inverse discrete Fourier transform.IFFT2 Two-dimensional inverse discrete Fourier transform. ICCEPS Inverse complex cepstrum.IDCT Inverse discrete cosine transform.

Dodając do komendy lookfor przyrostek -all

lookfor -all

spowodujesz wyszukiwanie w całym pliku pomocy, a nie tylko w linii H1.

Help Desk

Help Desk MATLAB-a daje Ci dostęp do szerokiego wachlarza informacji pomocniczych, przechowywanych na dysku lokalnym Twojego komputera lub na płycie CD-ROM. Wiele z tych dokumentów napisanych jest w języku HTML i

23

Page 24: Starting MATLAB … 2

dostęp do nich odbywa się poprzez przeglądarkę internetową (na przykład Netsacape lub Internet Explorer). Help Desk może być wywołany przez wybór opcji Help Desk z menu Help lub, na wszystkich komputerach, po wpisaniu komendy

helpdesk

Wszystkie operatory i funkcje MATLAB-a posiadają swoje strony w formacie HTML, które możesz wywołać z Help Desk’a. Strony te zawierają znacznie więcej informacji i szczegółów niż podstawowa pomoc. Dostępne są również inne dokumenty w formacie HTML, włącznie z tą instrukcją.

Komenda doc

Jeśli znasz nazwę konkretnej funkcji, możesz bezpośrednio obejrzeć jej opis. Na przykład, aby otrzymać pomoc na temat funkcji eval, wpisz doc eval

Jeśli będzie to konieczne, komenda doc automatycznie uruchomi Twoją przeglądarkę internetową.

Drukowanie stron pomocy

Strony pomocy, jak i reszta dokumentacji MATLAB-a, są dostępne również w formacie Portable Document Format (PDF). Dokumenty zapisane w tym formacie są otwierane przez program Acrobat reader firmy Adobe. Wyglądają one jak wydrukowane strony, zawierają grafikę, różnie czcionki oraz formaty. Jest to najlepszy sposób na uzyskanie wydruków.

Odnośnik do strony internetowej firmy MathWorks, Inc.

Jeśli masz dostęp do Internetu, Help Desk pozwoli Ci na połączenie się z firmą MathWorks, twórcą MATLAB-a. Możesz używać poczty elektronicznej aby zadawać pytania, przekazywać swoje sugestie oraz informować o znalezionych błędach. Możesz również użyć mechanizmu wyszukiwania rozwiązań (ang. Solution Search Engine) aby uzyskać dostęp do najświeższych informacji i dokumentów.

Środowisko MATLAB-a

Środowisko MATLAB-a zawiera zarówno zestaw zmiennych tworzonych podczas pracy, jak i zestaw plików przechowujących programy i dane po zakończeniu pracy.

Przestrzeń robocza

Przestrzeń robocza jest to obszar pamięci, do której użytkownik ma dostęp korzystając z linii poleceń MATLAB-a. Dwie komendy, who oraz whos, pokazują aktualną zawartość przestrzeni roboczej. Komenda who wyświetla skróconą listę, natomiast whos udostępnia również informacje o rozmiarze i sposobie przechowywania danych.

Oto przykład działania komendy whos, uaktywnionej w przestrzeni roboczej, zawierającej niektóre przykłady z tej książki. Można zaobserwować kilka różnych rodzajów struktur danych MATLAB-a. Jako ćwiczenie, możesz spróbować dopasować rodzaje zmiennych do odpowiadających im fragmentów kodu..

whos

Name Size Bytes Class

A 4x4 128 double arrayD 5x3 120 double arrayM 10x1 3816 cell arrayS 1x3 442 struct arrayh 1x11 22 char array

24

Page 25: Starting MATLAB … 2

n 1x1 8 double arrays 1x5 10 char arrayv 2x5 20 char array

Grand total is 471 elements using 4566 bytes.

Aby usunąć wszystkie zmienne istniejące w przestrzeni roboczej, użyj komendy clear

Komendy save

Komendy save zapisują zawartość przestrzeni roboczej w MAT-plikach, które mogą być później odczytane za pomocą komendy load. Na przykład

save Augustl7th

zapisuje całą zawartość przestrzeni roboczej w pliku August17th.mat. Jeśli chcesz, możesz zapisać tylko wybrane zmienne, podając ich nazwy po nazwie pliku.

Generalnie, zmienne są zapisywane w formacie binarnym, dzięki czemu mogą być szybko odczytywane przez MATLAB-a. Jeśli jednak chcesz mieć dostęp do swoich zmiennych poza MATLAB-em, możesz wybrać format alternatywny.

-ascii Wykorzystuje 8-cyfrowy zapis liczb. -ascii -double Wykorzystuje 16-cyfrowy zapis liczb. -ascii -double -tabs Oddziela liczby znakami tabulacji. -v4 Tworzy plik kompatybilny z czwartą wersją MATLAB-a -append Dodaje dane do istniejącego MAT-pliku.

Gdy zapisujesz zawartość przestrzeni roboczej w formacie tekstowym, nie zapisuj więcej niż jednej zmiennej za jednym razem. Jeśli zapiszesz więcej niż jedną zmienną, zostanie stworzony plik tekstowy, lecz nie będzie go można załadować z powrotem do MATLAB-a.

Ścieżka poszukiwań

MATLAB używa ścieżki poszukiwań, czyli uporządkowanej listy katalogów, aby określić jak uruchomić funkcje, które wywołujesz. Gdy wywołasz jedną z funkcji standardowych, MATLAB uruchamia pierwszy, znaleziony w ścieżce M-plik o odpowiedniej nazwie. Możesz to ominąć stosując specjalne, prywatne deklaracje oraz podfunkcje.

Komenda

path

pokazuje ścieżkę poszukiwań niezależnie od platformy sprzętowej, na której uruchomiony jest MATLAB. Na komputerach PC, możesz wybrać opcję Set Path z menu File aby oglądać lub modyfikować ścieżkę.

Zarządzanie plikami

Komendy dir, type, delete, oraz cd, implementują zestaw komend systemu operacyjnego, służących do zarządzania plikami. Poniższa tabela pokazuje jak komendy te wyglądają w innych systemach operacyjnych.

MATLAB MS-DOS UNIX VAX/VMSdir dir is dirtype type cat typedelete del or erase rm deletecd chdir cd set default

25

Page 26: Starting MATLAB … 2

Komenda diary

Komenda diary zapisuje w pliku dziennik Twoich sesji z MATLAB-em. Rezultaty działania tej komendy możesz oglądać i edytować przy użyciu dowolnego edytora tekstu. Aby utworzyć plik o nazwie diary, zawierający wszystkie wpisywane przez Ciebie komendy, jak również odpowiedzi MATLAB-a (wyłączając grafikę), wpisz

diary

Aby zapisać dziennik pod inną nazwą, wpisz

diary nazwa_pliku

Aby zatrzymać zapisywanie sesji, użyj komendy

diary off

Uruchamianie Zewnetrznych Programów

Znak wykrzyknika, ! , oznacza wyjście z shell’a i wskazuje, że dalsza część linii poleceń to komenda dla systemu operacyjnego. Jest to użyteczne przy wywoływaniu narzędzi i uruchamianiu innych programów, bez wychodzenia z MATLAB-a. Na przykład podczas pracy w systemie operacyjnym VMS, komenda

!edt magik.m

wywołuje edytor edt i otwiera w nim plik o nazwie magik.m. Gdy zamkniesz zewnętrzny program, system operacyjny zwróci kontrolę MATLAB-owi.

Więcej o Macierzach i Tablicach

W tym rozdziale nauczysz się więcej o pracy z macierzami i tablicami. Skupimy się na:

Algebrze liniowej Tablicach Danych o wielu zmiennych

Algebra Liniowa

Nieformalnie, terminy macierz i tablica są używane zamiennie. Bardziej precyzyjnie, macierz jest dwuwymiarową, numeryczną tablicą, która reprezentuje liniową transformację. Operacje matematyczne, definiowane na macierzach są częścią algebry liniowej.

Magiczny kwadrat Durer’a

A = 16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

umożliwił nam pokazanie Ci kilku operacji macierzowych udostępnionych przez MATLAB-a. Poznaliśmy już operację transpozycji macierzy, A’. Dodanie macierzy do jej odwróconej postaci, daje macierz symetryczną.

A + A' ans = 32 8 11 17 8 20 17 23 11 17 14 26

26

Page 27: Starting MATLAB … 2

17 23 26 2

Symbol mnożenia, *, oznacza mnożenie macierzy z uwzględnieniem wewnętrznych iloczynów pomiędzy rzędami a kolumnami. Pomnożenie macierzy przez jej odwróconą postać, również daje macierz symetryczną.

A'*A

ans = 378 212 206 360 212 370 368 206 206 368 370 212 360 206 212 378

Wyznacznik tej macierzy jest równy zeru, więc jest to macierz jednostkowa.

d = det(A) d =

0

Funkcja rref (reduced row echelon form) nie daje tożsamości:

R = rref(A) R = 1 0 0 1 0 1 0 -3 0 0 1 3 0 0 0 0

Ponieważ macierz jest jednostkowa, nie posiada postaci odwrotnej. Jeśli spróbujesz wykonać operację inwersji,

X = inv(A)

MATLAB wyświetli ostrzeżenie

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.175530e-017.

Błąd roundoff zapobiegł wykryciu przez algorytm inwersji faktu, że macierz jest jednostkowa.

Interesujące są wartości własne magicznego kwadratu:

e = eig(A) e = 34.0000 8.0000 0.0000 -8.0000

Jedna z wartości własnych wynosi zero, co jest kolejną konsekwencją tego, że macierz jest jednostkowa. Największa wartość własna, równa jest dobrze nam znanej magicznej sumie, czyli 34. Wynika to z faktu, że wektor składający się z samych jedynek jest wektorem własnym.

v = ones(4,1) v =

1 1 1 1

A*v27

Page 28: Starting MATLAB … 2

ans = 34 34 34 34

Prawostronne podzielenie macierzy A przez magiczną sumę,

P = A/34

daje macierz podwójną stochastyczną, w której sumy rzędów i kolumn równe są jedynce.

P =0.4706 0.0882 0.0588 0.3824 0.1471 0.2941 0.3235 0.2353 0.2647 0.1765 0.2059 0.3529 0.1176 0.4412 0.4118 0.0294

Macierze takie reprezentują przejściowe prawdopodobieństwa w procesie Markova. Powtarzane potęgi macierzy odpowiadają powtarzanym krokom procesu. Dla naszego przykładu, piąta potęga

P^5

wynosi

0.2507 0.2495 0.2494 0.2504 0.2497 0.2501 0.2502 0.2500 0.2500 0.2498 0.2499 0.2503 0.2496 0.2506 0.2505 0.2493

Oznacza to, że gdy k zbliża się do nieskończoności, wszystkie elementy o k-tej potędze, Pk , dążą do wartości ¼.Ostatecznie, współczynniki wielomianu charakterystycznego

poly(A)

mają wartości

1 -34 -64 2176 0

Oznacza to, że wielomian charakterystyczny

det(A - cI)

to

4 – 343 – 642 – 2176

Wyraz wolny równy jest zeru, gdyż macierz jest jednostkowa, natomiast współczynnik przy trzeciej potędze równy jest –34, ponieważ macierz jest magiczna!

Tablice

Gdy zabierzemy macierze ze świata algebry liniowej, staną się one dwuwymiarowymi tablicami numerycznymi. Operacje arytmetyczne są wykonywane na tablicach element po elemencie. Oznacza to, że dodawanie i odejmowanie jest takie samo dla tablic i dla macierzy, jednak operatory mnożenia i dzielenia są w przypadku tablic inne. MATLAB używa kropki lub przecinka dziesiętnego jako elementu notacji dla tych operatorów.

Zestaw operacji na tablicach zawiera:

+ Dodawanie - Odejmowanie

28

Page 29: Starting MATLAB … 2

.* Mnożenie element-przez-element

./ Dzielenie element-przez-element

.\ Lewostronne dzielenie element-przez-element

.^ Potęga element-przez-element

.' Transpozycja tablicy

Jeśli pomnożymy magiczny kwadrat Durer’a przez jego samego, przy użyciu operatora mnożenia tablic A.*A

otrzymamy tablicę zawierającą kwadraty liczb całkowitych od 1 do 16.

ans =256 9 4 169 25 100 121 64 81 36 49 144 16 225 196 1

Operacje tablicowe są użyteczne przy budowaniu tabel. Niech n będzie wektorem kolumny n = (0:9)';

Wtedy

paws = [n n.^2 2.^n]

utworzy tabelę zawierającą kwadraty i potęgi dwójki.

pows = 0 0 1 1 1 2 2 4 4 3 9 8 4 16 16 5 25 32 6 36 64 7 49 128 8 64 256 9 81 512

Elementarne funkcje matematyczne działają na tablicach element po elemencie. Więc

format short g x = (1:0.1:2)'; logs = [x log10(x)]

tworzy tabelę logarytmów.

logs = 1.0 0 1.1 0.04139 1.2 0.07918 1.3 0.11394 1.4 0.14613 1.5 0.17609 1.6 0.20412 1.7 0.23045 1.8 0.25527 1.9 0.27875 2.0 0.30103

29

Page 30: Starting MATLAB … 2

Dane o Wielu Zmiennych

Dla statystycznych danych o wielu zmiennych, MATLAB używa kolumnowo zorientowanej analizy. Każda kolumna w zestawie danych reprezentuje zmienną, natomiast każdy wiersz – obserwację. Element o indeksie (i,j) jest i-tą obserwacją i j-tą zmienną.

Dla przykładu, rozważ zestaw danych z trzema zmiennymi:

Częstość uderzeń serca Waga Ilość godzin ćwiczeń w tygodniu

Dla pięciu obserwacji, wynikowa tablica może wyglądać następująco:

D =72 134 3.2 81 201 3.5 69 156 7.1 82 148 2.4 75 170 1.2

Pierwszy wiersz zawiera częstość uderzeń serca, wagę i ilość godzin ćwiczeń w tygodniu dla pacjenta 1, drugi wiersz zawiera dane pacjenta 2 i tak dalej. Teraz możesz zastosować do tego zestawu danych wiele funkcji umożliwiających jego analizę. Na przykład, aby otrzymać średnie i standardowe odchylenie każdej kolumny, wpisz:

mu = mean(D), sigma = std(D)

mu = 75.8 161.8 3.48

sigma = 5.6303 25.499 2.2107

Aby uzyskać listę funkcji służących do analizy danych, wpisz help datafun

Jeśli masz zainstalowany przybornik Statistics, wpisz help stats

Rozszerzanie Skalarów

Macierze i skalary mogą być łączone na wiele różnych sposobów. Na przykład, skalar może zostać odjęty od macierzy poprzez odjęcie go od każdego jej elementu. Średnia wartość elementów naszego, magicznego kwadratu wynosi 8.5, więc

B = A - 8.5

utworzy macierz, której sumy kolumn są równe zeru.

B =7.5 -5.5 -6.5 4.5-3.5 1.5 2.5 -0.50.5 -2.5 -1.5 3.5

-4.5 6.5 5.5 -7.5 sum(B) ans =

0 0 0 0

30

Page 31: Starting MATLAB … 2

Podczas rozszerzania skalarów, MATLAB przydziela specjalny skalar do wszystkich indeksów. Na przykład:

B(1:2,2:3) = 0

B = 7.5 0 0 4.5 -3.5 0 0 -0.5 0.5 -2.5 -1.5 3.5 -4.5 6.5 5.5 -7.5

Logiczne indeksowanie

Logiczne wektory, tworzone przy użyciu logicznych i relacyjnych operatorów, mogą być wykorzystywane jako referencje do tablic zagnieżdżonych. Załóżmy, że X jest zwykłą macierzą, natomiast L jest macierzą o tym samym rozmiarze i jest rezultatem jakiejś logicznej operacji. Wtedy X(L) oznacza elementy macierzy X, dla których elementy macierzy L są niezerowe.

Tego typu indeksowanie może być wykonane w jednym kroku, poprzez wybór operacji logicznej jako wyrażenia indeksującego. Załóżmy, że posiadasz następujący zestaw danych.

x = 2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

NaN oznacza brakującą obserwację. Aby usunąć brakujące dane za pomocą logicznego indeksowania, użyj funkcji finite (x), która zwraca prawdę dla wszystkich skończonych wartości numerycznych, natomiast fałsz – dla wartości NaN oraz Inf (nieskończoność).

x = x(finite(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8

Zwróć uwagę na obserwację o wartości 5.1. Różni się one znacznie od reszty obserwacji. Jest to tzw. outlier, czyli element leżący poza zakresem. Poniższy zapis usuwa takie elementy. Dla naszego przykładu, są to elementy większe od trzykrotnego odchylenia standardowego.

x = x(abs(x-mean(x)) <= 3*std(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8

W kolejnym przykładzie, pokażemy lokacje liczb pierwszych w magicznym kwadracie Durer’a, przy użyciu logicznego indeksowania i rozszerzania skalarów, co wyzeruje wszystkie liczby nie będące pierwszymi.

A(-isprime(A)) = 0

A = 0 3 2 13 5 0 11 0 0 0 7 0 0 0 0 0

Funkcja find

Funkcja find określa indeksy elementów tablicy, które spełniają określony warunek logiczny. W swojej najprostszej postaci, funkcja ta zwraca wektor indeksów w postaci kolumny. Po dokonaniu transpozycji, otrzymamy rząd indeksów. Na przykład

k = find(isprime(A))'

31

Page 32: Starting MATLAB … 2

wskaże lokacje liczb pierwszych w magicznym kwadracie, używając jednowymiarowego indeksowania.

k = 2 5 9 10 11 13

Aby wyświetlić te liczby pierwsze w porządku wyznaczonym przez k, wpisz

A(k)

ans = 5 3 2 11 7 13

Kiedy użyjesz k jako lewostronnego indeksu, struktura macierzy zostanie zachowana.

A(k) = NaN

A = 16 NaN NaN NaN NaN 10 NaN 8 9 6 NaN 12 4 15 14 1

Kontrola przepływu

MATLAB posiada pięć instrukcji umożliwiających kontrolę przepływu:

instrukcję if instrukcję switch pętlę for pętlę while instrukcję break

if

Jest to instrukcja warunkowa, która rozwiązuje wyrażenie logiczne i zezwala na wykonanie grupy poleceń, gdy wynik tego wyrażenia jest prawdą (ang. true). Opcjonalne słowa kluczowe elseif oraz else umożliwiają wykonywanie alternatywnych grup poleceń. Słowo kluczowe end oznacza koniec listy poleceń do wykonania w obrębie działania instrukcji if. Grupy poleceń są określane przy użyciu czterech słów kluczowych – nawiasy nie są dozwolone.

Algorytm MATLAB-a generujący magiczny kwadrat rzędu n, wykonywany jest inaczej dla każdego z trzech przypadków: gdy n jest nieparzyste, gdy n jest parzyste lecz nie podzielne przez 4 i gdy n jest podzielne przez 4.

if rem(n,2) -= 0 M = odd_magic(n) elseif rem(n,4) -= 0

M = single_even_magic(n) else M = double_even_magic (n) end

W przykładzie tym, wszystkie trzy przypadki wzajemnie się wykluczają, lecz gdyby tak nie było, zostałby uruchomiony pierwszy prawdziwy warunek.

Bardzo ważne jest zrozumienie jak operatory relacyjne oraz instrukcja if działają z macierzami. Jeśli chcesz sprawdzić czy dwie zmienne są sobie równe, możesz użyć zapisu if A == B, ...

32

Page 33: Starting MATLAB … 2

Jest to prawidłowa instrukcja MATLAB-a i jej rezultatem będzie to, czego się spodziewasz, gdy A i B będą skalarami. Jednak jeśli A i B są macierzami, A == B nie sprawdzi czy są one równe, lecz gdzie są one równe. Jeżeli macierze A i B nie będą miały tego samego rozmiaru, zapis A == B spowoduje wystąpienie błędu.

Poprawnym sposobem na sprawdzenie równości dwóch zmiennych jest funkcja isequal

if isequal(A,B), ...

Oto kolejny przykład. Jeśli A i B będą skalarami, w poniższym programie nigdy nie wystąpi nieoczekiwana sytuacja. Jednak dla większości par macierzy, włącznie z magicznymi kwadratami o zamienionych kolumnach, żaden z warunków A > B, A < B lub A == B, nie będzie prawdziwy dla wszystkich elementów, więc zostanie uruchomiona klauzula else.

if A > B 'greater' elseif A < B 'less' elseif A == B

'equal' else

error('Unexpected situation') end

Niektóre funkcje mogą być pomocne podczas redukowania rezultatów porównań macierzy i skalarów, przy użyciu funkcji if, na przykład

isequal isempty allany

switch oraz case

Switch uruchamia grupę instrukcji bazując na wartości zmiennej lub wyrażenia. Grupy instrukcji określane są przez słowa kluczowe case oraz otherwise. Uruchamiana jest tylko pierwsza pasująca grupa case. Aby prawidłowo zakończyć składnię instrukcji switch, należy umieścić na jej końcu słowo kluczowe end.

Logikę algorytmu tworzącego magiczne kwadraty można również opisać przy użyciu instrukcji switch: switch (rem(n,4)==0) + (rem(n,2)==0)

case 0M = odd magic(n)

case 1M = single_even magic(n)

case 2M = double_even magic(n)

otherwiseerror('This is impossible')

end

Uwaga dla osób programujących w języku C. W przeciwieństwie do instrukcji switch w języku C, jej odpowiednik w MATLAB-ie uruchamia tylko pierwszą, prawdziwą grupę case, więc nie ma potrzeby stosowania instrukcji brake.

for

Pętla for powtarza grupę instrukcji stałą i określoną ilość razy. Każda pętla for musi być zakończona przez instrukcję end.

for n = 3:32 r(n) = rank(magic(n));

33

Page 34: Starting MATLAB … 2

end r

Średnik na końcu drugiej linii powyższego kodu, zapobiega wielokrotnemu drukowaniu, natomiast r powoduje wyświetlenie ostatecznego wyniku (dlatego znajduje się poza pętlą).

Dobrym zwyczajem podczas programowania pętli, jest wykonywanie wcięć. Zwiększa to czytelność kodu, zwłaszcza gdy pętle są zagnieżdżone.

for i = 1:m for j = 1:n

H(i,j) = 1/(i+j ); end end

while

Pętla while (dopóki) powtarza grupę poleceń nieokreśloną ilość razy, pod kontrolą warunku logicznego. Aby zakończyć składnię while, musisz na jej końcu umieścić polecenie end.

Oto kompletny program, ilustrujący działanie funkcji while, if, else oraz end. Program używa bisekcji w celu znalezienia miejsca zerowego wielomianu.

a = 0; fa = -Inf; b = 3; fb = Inf; while b-a > eps*b

x = (a+b)/2; fx = x^3-2*x-5;if sign(fx) == sign(fa) a = x; fa = fx; else

b = x; fb = fx; end

end x

Rezultatem jest pierwiastek wielomianu x3 – 2x – 5, czyli

x = 2.09455148154233

Uwagi dotyczące porównywania macierzy, omówione w rozdziale dotyczącym instrukcji if, należy brać pod uwagę również podczas stosowania pętli while.

break

Instrukcja break pozwala opuścić wykonywaną pętle for lub while przed jej zakończeniem. W przypadku pętli zagnieżdżonych, break spowoduje opuszczenie „najgłębszej” pętli.

Oto udoskonalenie przykładu z poprzedniego rozdziału. Dlaczego wykorzystanie instrukcji break jest dobrym pomysłem?

a = 0; fa = -Inf; b = 3; fb = Inf; while b-a > eps*b x = (a+b)/2; fx = x^3-2*x-5; if fx == 0 break

34

Page 35: Starting MATLAB … 2

elseif sign(fx) == sign(fa) a = x; fa = fx; else b = x; fb = fx; end end x

Inne Struktury Danych

W tym rozdziale poznasz kilka innych struktur danych, istniejących w MATLAB-ie. Będą to:

Tablice wielowymiarowe Tablice komórkowe Znaki i tekst Struktury

Tablice Wielowymiarowe

Tablice wielowymiarowe w MATLAB-ie są tablicami, których elementy posiadają więcej niż dwa indeksy. Tablice takie można tworzyć podając więcej niż dwa argumenty funkcjom zeros, ones, rand oraz randn. Na przykład:

R = randn(3,4,5);

tworzy tablicę 3 na 4 na 5, zawierającą w sumie 3x4x5 = 60 losowych elementów o normalnej dystrybuancie. Trójwymiarowe tablice mogą reprezentować trójwymiarowe dane fizyczne, jak choćby temperaturę w pokoju, opisaną na prostokątnej siatce. Tablice te mogą również przedstawiać sekwencję macierzy, A(k), lub zależnych od czasu części macierzy, A(t). W drugim przypadku, element o indeksie (i,j) k-tej macierzy lub tk-ta macierz, będą oznaczane przez A(i,j,k).

Magiczny kwadrat Durer’a różni się od wersji MATLAB-a zamienionymi kolumnami. Poprzez taką zmianę możne wygenerować wiele magicznych kwadratów. Zapis

p = perms(1:4);

generuje 4! = 24 permutacje wyrażenia 1:4. k-ta permutacja jest wektorem w postaci rzędu, p(k,:). Wobec tego

A = magic(4);M = zeros(4,4,24); for k = 1:24

M(:,:.k) = A(:,p(k,:)): end

zapisuje sekwencję 24 magicznych kwadratów w trójwymiarowej tablicy M. Rozmiar M to

size(M) ans =

4 4 24

35

Page 36: Starting MATLAB … 2

Okazuje się, że 22 macierz w sekwencji, to macierz Durer’a:

M(:,:,22) ans =

16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

Wyrażenie

sum(M,d)

oblicza sumy w zależności od indeksu d. Zatem

sum(M,1)

tworzy tablicę 1 na 4 na 24, zawierającą 24 kopie rzędu

34 34 34 34

natomiast

sum(M,2)

daje tablicę 1 na 4 na 24, zawierającą 24 kopie kolumny

34 34 34 34

Ostatecznie,

S = sum(M,3)

tworzy sekwencję 24 macierzy. Rezultat ma rozmiar 4 na 4 na 1, wiec wygląda jak zwykła tablica 4 na 4.

S = 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204

36

Page 37: Starting MATLAB … 2

Tablice komórkowe

Tablice komórkowe w MATLAB-ie są wielowymiarowymi tablicami, których elementy są kopiami innych tablic. Tablica komórkowa, składająca się z pustych macierzy, może być utworzona za pomocą funkcji cell. Jednak, częściej tablice komórkowe tworzy się, zawierając w nawiasach klamrowych, {} , różne elementy. Nawiasy klamrowe są również wykorzystywane wraz z indeksami, w celu uzyskania zawartości różnych komórek. Na przykład

C = {A sum(A) prod(prod(A))}

tworzy tablicę komórkową o rozmiarze 1 na 3. Trzy komórki zawierają kolejno: magiczny kwadrat, wektor składający się z sum kolumn oraz iloczyn wszystkich elementów. Gdy wyświetlisz C, otrzymasz

C =[4x4 double] [1x4 double] [20922789888000]

Dzieje się tak dlatego, że zawartość dwóch pierwszych komórek jest zbyt duża aby wyświetlić je w ograniczonym obszarze okna poleceń, natomiast ostatnia, trzecia komórka zawiera tylko jedną liczbę, 16!, więc nie ma problemu z jej wyświetleniem.

Oto dwie istotne i warte zapamiętania uwagi. Po pierwsze, aby uzyskać zawartość jednej z komórek, używaj indeksów w nawiasach klamrowych. Na przykład, C{1} zwraca magiczny kwadrat, a C{3} oznacza 16!. Po drugie, tablice komórkowe zawierają kopie innych tablic a nie wskaźniki do tych tablic. Jeśli zmienisz coś w tablicy A, elementy tablicy C nie ulegną zmianie.

Trójwymiarowe tablice mogą być użyte do przechowywania sekwencji macierzy o tych samych rozmiarach. Natomiast, tablice komórkowe mogą z powodzeniem przechowywać sekwencje macierzy o różnych rozmiarach. Na przykład,

M = cells(8,1); for n = 1:8 M{n} = magic(n); end M

tworzy sekwencję magicznych kwadratów różnych rzędów,

M = [ 1] [ 2x2 double] [ 3x3 double] [ 4x4 double] [ 5x5 double] [ 6x6 double] [ 7x7 double] [ 8x8 double]

37

Page 38: Starting MATLAB … 2

Aby uzyskać naszego starego przyjaciela, użyj

M{4}

Znaki i tekst

Aby wpisać tekst w MATLAB-ie, użyj apostrofów. Na przykład,

s = 'Hello'

Rezultatem nie będzie taka macierz numeryczna, z jaką mieliśmy do czynienia do tej pory. Rezultatem będzie macierz znakowa o rozmiarze 1 na 5.

Generalnie, znaki są zapisywane jako numery, lecz nie w formacie zmiennoprzecinkowym. Wyrażenie

a = double(s)

spowoduje konwersję tablicy znakowej do postaci numerycznej macierzy, zawierającej zmiennoprzecinkowe reprezentacje kodów ASCII każdego ze znaków. Czyli

a =

72 101 108 108 111

Polecenie

s = char(a)

odwraca konwesję.Konwersja liczb do postaci znaków, umożliwia wykorzystanie czcionek zainstalowanych w Twoim systemie. W standardowym zestawie ASCII, możliwe do wydrukowania znaki są reprezentowane przez liczby całkowite od 32 do

38

Page 39: Starting MATLAB … 2

127 (liczby poniżej 32 odpowiadają znakom kontrolnym, których nie można drukować). Liczby te są zorganizowane w tablicę o rozmiarach 6 na 16 za pomocą polecenia

F = reshape(32:127,16,6)';

Możliwe do wydrukowania znaki w rozszerzonym zestawie ASCII, są reprezentowane przez F+128. Gdy liczby te są interpretowane jako znaki, rezultat zależy od bieżącej czcionki. Wpisz poniższe polecenia

char(F) char(F+128)

po czym zmień czcionkę, której MATLAB używa w oknie poleceń. Na komputerze PC, wybierz opcję Preferences z menu File. Spróbuj użyć czcionek Sybol oraz Wingdings, jeśli oczywiście posiadasz je w systemie. Oto przykład rezultatu, jaki można w ten sposób osiągnąć:

!"#$%&'[)`+r-./ 0123456789:;<=>? @ABCDEFGHIJKLMNO PORSTUVWXYZ[\]"_ ~abcdefghijklmno pqrstuvwxyz{~}

? ° Q£5 • 11 Da~~ . .. xk9 m-saMNJ~]jnJę S&e Li~Jf~.4«»... A AÓ~ - "'-.~yY/~~ >fifl $ ~ ,-„8óP,E,4EEI I I I Ó iÓllUUi"___.°,.`.

Poniższe wyrażenie łączy zmienne tekstowe w jeden, dłuższy ciąg:

h = [s, ' world']

otrzymujemy wynik poziomego połączenia ciągów

h= Hello world

Natomiast polecenie

v = [s; 'world']

łączy ciągi poziomo, i daje

v = Hello world

Zwróć uwagę na to, że w ciągu h, przed ‘ w’ dodana została spacja, natomiast w ciągu v, obydwa słowa mają taką samą długość. Otrzymaliśmy dwie tablice znakowe: h ma rozmiar 1 na 11, natomiast v – 2 na 5.

Aby manipulować tekstem, zawierającym linie o różnych długościach, możesz utworzyć tablicę znakową lub tablicę komórkową. Funkcja char akceptuje każdą ilość linii i jeśli trzeba dodaje spacje, aby wszystkie linie zapisane w wierszach tablicy, zawierały taką samą ilość znaków. Funkcja ta formuje tablicę znakową, zawierającą jedną linię w każdym rzędzie. Na przykład

S = char('A','rolling','stone','gathers','momentum.')

tworzy tablicę znakową o rozmiarze 5 na 9.

S = A rolling

39

Page 40: Starting MATLAB … 2

stone gathers momentum.

W każdym z czterech pierwszych rzędów tablicy S, jest wystarczająca ilość spacji, aby wszystkie rzędy miały tę samą długość. Możesz również przechowywać tekst w tablicy komórkowej. Na przykład

C = {'A';'rolling';'stone';'gathers';'momentum.'}

jest tablicą komórkową o rozmiarze 5 na 1

C = 'A' 'rolling' 'stone' 'gathers' 'momentum.'

Aby dokonać konwersji tablicy znakowej do postaci tablicy komórkowej, wpisz

C = cellstr(S)

proces odwrotny umożliwia polecenie

S = char(C)

Struktury

Struktury w MATLAB-ie są wielowymiarowymi tablicami, w których dostęp do elementów jest możliwy przez podanie nazwy pola. Na przykład

S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'

tworzy skalarną strukturę, zawierającą trzy pola

S = name: 'Ed Plum' score: 83 grade: 'B+'

Tak jak wszystko w MATLAB-ie, struktury są tablicami, więc możesz w nich umieszczać dodatkowe elementy. W tym przypadku, każdy element tablicy jest strukturą posiadającą kilka pól. Pola można dodawać po jednym,

S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-';

można też dodać cały element przy użyciu jednego wyrażenia.

S(3) = struct('name','JerryGarcia',... 'score',70,'grade','C')

Teraz nasza struktura jest na tyle duża, że drukowane jest tylko podsumowanie.

S = 1x3 struct array with fields: name

score grade

40

Page 41: Starting MATLAB … 2

Istnieje kilka sposobów umieszczania różnych pól w innych tablicach MATLAB-a. Jednak notacja wszystkich sposobów, bazuje na liście, której elementy są oddzielone przecinkami. Zapis

S.score

jest równoznaczny zapisowi

S(1).score, S(2).score, S(3).score

Jest to lista elementów oddzielonych przecinkami. Przydziela ona jednocześnie trzy wyniki (ang. scores), do domyślnej zmiennej ans i posłusznie wyświetla wynik każdego przydzielenia. Jednak jeśli ujmiesz to wyrażenie w nawiasy kwadratowe,

[S.score]

będzie to oznaczać

[S(1).score, S(2).score, S(3).score]

co daje nam numeryczny wektor, zawierający wszystkie wyniki.

ans = 83 91 70

Podobnie, pisząc

S.name

po prostu jednocześnie przydzielisz nazwiska (ang. names) do zmiennej ans. Jednak ujmując wyrażenie w nawiasy klamrowe,

{S.name}

utworzysz tablicę komórkową o rozmiarze 1 na 3, zawierającą trzy nazwiska.

ans = 'Ed Plum' 'Toni Miller' 'Jerry Garcia'

Wyrażenie

char(S.name)

wywoła funkcję char z trzema argumentami, co spowoduje utworzenie z pól zawierających nazwiska, tablicy znakowej:

ans = Ed Plum Toni Miller Jerry Garcia

Skrypty i Funkcje

MATLAB jest zarówno potężnym językiem programowania, jak i interaktywnym środowiskiem obliczeniowym. Pliki zawierające kod MATLAB-a zwane są M-plikami. Tworzymy je przy użyciu edytora tekstu. M-pliki wykorzystujemy tak jak inne jakiekolwiek inne funkcje, czy też komendy MATLAB-a.Istnieją dwa rodzaje M-plików:

Skrypty, które nie akceptują argumentów wejściowych i nie zwracają wartości wyjściowych. Operują na danych z obszaru roboczego.

Funkcje, które akceptują argumenty wejściowe i zwracają wartości wyjściowe. Zmienne wewnętrzne są lokalne dla funkcji.

41

Page 42: Starting MATLAB … 2

Jeśli jesteś początkującym programistą MATLAB-a, na razie twórz M-pliki, które chcesz wypróbować, tylko w bieżącym katalogu. Gdy nabierzesz więcej wprawy w konstruowaniu własnych M-plików, z pewnością zechcesz organizować je w innych katalogach i budować z nich własne przyborniki, które później będziesz mógł dodać do ścieżki poszukiwań MATLAB-a.

Jeśli nazwy funkcji będą się powtarzać, MATLAB uruchomi tę, która występuje jako pierwsza na liście poszukiwań.Aby obejrzeć zawartość M-pliku, na przykład, myfunction.m, po prostu wpisz

type myfunction

Skrypty

Gdy wywołasz skrypt, MATLAB po prostu wykona komendy w nim zawarte. Skrypty mogą operować na danych znajdujących się w przestrzeni roboczej, jak również mogą tworzyć nowe dane, na których mają operować. Mimo iż skrypty nie zwracają argumentów wyjściowych, każda zmienna będąca wynikiem działania skryptu, pozostaje w przestrzeni roboczej i może być wykorzystywana w późniejszych obliczeniach. Dodatkowo, skrypty mogą generować grafikę, używając funkcji takich jak plot.

Dla przykładu, utwórz plik o nazwie magicrank.m, zawierający następujące komendy MATLAB-a:

%Bada stopnie magicznych kwadratów r = zeros(1,32); for n = 3:32 r(n) = rank(magic(n)); end r bar(r)

Wpisanie

magicrank

spowoduje, że MATLAB wykona komendy zapisane w M-pliku, obliczy rząd 30 pierwszych magicznych kwadratów i wykreśli rezultat w postaci graficznej. Po zakończeniu wykonywania pliku, zmienne n oraz r pozostaną w przestrzeni roboczej.

42

Page 43: Starting MATLAB … 2

Funkcje

Funkcje są M-plikami, które akceptują argumenty wejściowe i zwracają argumenty wyjściowe. Nazwa M-pliku i funkcji, którą realizuje, powinna być identyczna. Funkcje operują na zmiennych znajdujących się w ich własnej przestrzeni roboczej.

Dobrym przykładem jest funkcja rank. M-plik rank.m znajduje się w katalogu

toolbox/matlab/matfun

Możesz obejrzeć zawartość pliku, wpisując

type rank

Oto zawartość pliku. function r = rank(A,tol) %RANK Matrix rank. %RANK(A) provides an estimate of the number of linearly %independent rows or columns of a matrix A. %RANK(A,tol) is the number of singular values of %A that are larger than tol. %RANK(A) uses the default tol=max(size(A)) * norm(A) * eps. s = svd(A);

if nargin==1 tol = max(size(A)) * max(s) * eps;

end r = sum(s > tol);

Pierwsza linia funkcji rozpoczyna się słowem kluczowym function. Nadaje ono funkcji nazwę oraz porządkuje argumenty. W tym przypadku, istnieją maksymalnie dwa argumenty wejściowe i jeden wyjściowy.

Następne kilka linii, aż do pierwszej pustej lub uruchamialnej, to komentarz udostępniający pomoc. Właśnie te linie zostaną wyświetlone, gdy wpiszesz

help rank

Pierwsza linia tekstu pomocy, to linia H1, którą MATLAB wyświetla, gdy używasz komendy lookfor.Reszta pliku to uruchamialny kod MATLAB-a, definiujący funkcję. Zmienna s, definiowana w ciele funkcji, podobnie jak zmienne r, A oraz tol, jest lokalna dla funkcji. Zmienne te nie są dostępne z linii poleceń MATLAB-a.Poniższy przykład ilustruje nietypową dla innych języków programowania właściwość funkcji MATLAB-a – zmienną ilość argumentów. Funkcja rank może być wykorzystana na kilka sposobów:

rank(A) r = rank(A) r = rank(A,1.e-6)

Wiele M-plików działa w ten sposób. Jeśli nie zostanie podany argument wyjściowy, rezultat wykonania funkcji będzie zapisany w domyślnej zmiennej ans. Jeśli nie zostanie podany jeden z argumentów wejściowych, funkcja wykorzysta wartość domyślną. Wewnątrz funkcji, dwie wartości o nazwach nargin oraz nargout, informują o ilości argumentów wejściowych i wyjściowych, wykorzystywanych podczas każdego wykonywania funkcji. Funkcja rank wykorzystuje nargin, lecz nie musi korzystać z nargout.

Zmienne Globalne

Jeśli chcesz, aby więcej niż jedna funkcja korzystała z jednej kopii tej samej zmiennej, po prostu zadeklaruj tę zmienną jako globalną we wszystkich funkcjach. Zrób to także z poziomu linii poleceń, jeśli chcesz aby zmienna była dostępna również w bazowej przestrzeni roboczej. Deklaracja globalności zmiennej musi wystąpić zanim będzie ona

43

Page 44: Starting MATLAB … 2

wykorzystywana w funkcji. Mimo iż nie jest to konieczne, pisanie nazw zmiennych globalnych wielkimi literami doskonale odróżni je od nazw innych zmiennych. Dla przykładu, utwórz M-plik o nazwie falling.m:

function h = falling (t) global GRAVITY h = 1/2*GRAVITY*t.^2;

Następnie wpisz:

global GRAVITY GRAVITY = 32; y = falling((0:.1:5)');

Dzięki zadeklarowaniu zmiennej GRAVITY jako globalnej, masz do niej dostęp z linii poleceń i możesz wprowadzać do niej różne wartości, bez potrzeby edytowania M-pliku.

Dualność Komend/Funkcji

Komendy MATLAB-a wyglądają przykładowo tak:

load help

Wiele komend akceptuje parametry:

help magictype rank

Alternatywna metoda podawania tych parametrów, czyni z nich łańcuchy argumentów funkcji.

load('August17.dat') help('magic') type('rank')

To jest właśnie „dualność komend/funkcji” MATLAB-a.

Każda komenda o postaci

komenda argument

może być również zapisana w formie funkcji

komenda(‘argument’)

Korzyści z takiego zapisu przychodzą gdy łańcuch argumentów składa się z wielu różnych części. Poniższy przykład przetwarza wiele plików zawierających dane, August1.dat, August2.dat i tak dalej. W przykładzie wykorzystano także funkcję int2str, która konwertuje liczbę całkowitą do postaci ciągu znaków, w celu uzyskania nazwy pliku.

for d = 1:31 s = ['August' int2str(d) '.dat'] load(s) %Przetwarza zawartość d-tego pliku end

Funkcja eval

Funkcja eval działa na zmiennych tekstowych. Wyrażenie

eval(s)

44

Page 45: Starting MATLAB … 2

wykorzystuje interpreter MATLAB-a do rozwiązania wyrażenia lub do uruchomienia komendy, zawartej w tekstowej zmiennej s.

Przykład z poprzedniego rozdziału można zrealizować także przy użyciu poniższego kodu, jednak będzie to mniej wydajne, ponieważ wykorzystywany będzie cały interpreter, a nie tylko wywołanie funkcji.

for d = 1:31 s = ['load August' int2char(d) '.dat'] eval(s) %Przetwarza zawartość d-tego pliku end

Wektoryzacja

Aby osiągnąć największą wydajność podczas pracy w MATLAB-ie, możesz wektoryzować algorytmy zapisane w Twoich M-plikach. Tam gdzie inne języki programowania muszą używać pętli for lub DO, MATLAB potrafi korzystać z operacji na wektorach lub macierzach. Poniższy przykład tworzy tabelę logarytmów.

x = 0; for k = 1:1001 y(k) = 1og10(x); x = x + .01; end

A oto ten sam kod, poddany wektoryzacji.

x = 0:.01:10; y = 1og10(x);

W przypadku bardziej skomplikowanego kodu, wektoryzacja nie zawsze jest taka prosta. Jednak, gdy liczy się prędkość, zawsze szukaj sposobu na jej wykonanie.

Zaawansowani użytkownicy MATLAB-a zwykli mówić: „Życie jest zbyt krótkie aby spędzić je na pisaniu pętli for.”

Prealokacja

Jeśli nie możesz dokonać wektoryzacji fragmentu kodu, możesz przyspieszyć działanie pętli for poprzez prealokację wektorów czy też macierzy, w których będą przechowywane rezultaty obliczeń. Na przykład, ten kod używa funkcji zeros, aby dokonać prealokacji wektora tworzonego w pętli for. Dzięki temu pętla będzie się wykonywać znacznie szybciej.

r = zeros (32,1); for n = 1:32

r(n) = rank(magic(n)); end

Bez prealokacji, interpreter MATLAB-a zwiększałby wektor r o jeden element przy każdym przebiegu pętli. Prealokacja likwiduje ten krok i w rezultacie powoduje szybsze wykonanie pętli for.

Funkcje Funkcji

Klasa funkcji, zwana „funkcjami funkcji”, działa z nieliniowymi funkcjami zmiennych skalarnych. Oznacza to, że funkcje działają na innych funkcjach. W tej grupie znajdują się funkcje, takie jak:

Odnajdywanie zera Optymizacja Kwadratura Zwyczajne równania różniczkowe

45

Page 46: Starting MATLAB … 2

MATLAB reprezentuje nieliniową funkcję poprzez funkcję zawartą w M-pliku. Na przykład, oto uproszczona wersja funkcji humps, znajdującej się w katalogu matlab/demos:

function y = humps (x) y = 1./((x-.3).^2 + .01) + 1./((x-.9).^2 + .04) - 6;

Uruchom tę funkcję, korzystając z zestawu punktów należących do przedziału 0 x 1,

x = 0:.002:1;y = humps(x);

Następnie utwórz wykres funkcji,

plot(x,y)

Na wykresie można zaobserwować, że funkcja posiada minimum lokalne w pobliżu x = 0.6. Funkcja fmins odnajduje wartości zwane minimizerami, czyli wartości x, dla których funkcja osiąga minimum. Pierwszym argumentem funkcji fmins jest nazwa funkcji, której minimizery mają być wyszukiwane, natomiast drugim – przypuszczalna lokacja minimum.

p = fmins('humps',.5) p = 0.6370

Aby zastosować funkcję do minimizera, wpisz humps(p)

ans = 11.2528

Analitycy używają określeń kwadratura oraz integracja, do opisywania różnicy między numeryczną aproksymacją całek nieoznaczonych oraz numeryczną integracją zwyczajnych równań różniczkowych. Funkcje kwadratury w MATLAB-ie to quad oraz quad8. Poniższy zapis

Q = quad8('humps',0,1)

oblicza obszar pod krzywą znajdującą się na wykresie i daje

Q = 29.8583

46

Page 47: Starting MATLAB … 2

Ostatecznie, na wykresie widzimy, że funkcja nigdy nie osiąga w tym przedziale zera. Zatem, jeśli spróbujesz poszukać zera za pomocą

z = fzero('humps',.5)

odnajdziesz jedno, lecz poza przedziałem widocznym na wykresie

z =-0.1316

System Handle Graphics

MATLAB oferuje zestaw funkcji niskiego poziomu, które umożliwiają tworzenie i manipulowanie liniami, powierzchniami i innymi obiektami graficznymi. System ten jest zwany Handle Graphics.

Obiekty Graficzne

Obiekty graficzne są podstawowymi elementami systemu Handle Graphics MATLAB-a. Obiekty te są zorganizowane w postaci hierarchicznego drzewa. Podkreśla to współzależność tych obiektów. Na przykład, obiekty Line wymagają obiektów Axes, jako punktu odniesienia. Z kolei, obiekty Axes istnieją tylko wewnątrz obiektów Figure.

Obiekty Graficzne

Istnieje jedenaście typów obiektów systemu Handle Graphics:

Obiekt Root znajduje się na szczycie hierarchii. Odpowiedzialny jest za to, co widzimy na ekranie komputera. MATLAB automatycznie tworzy obiekt Root, na początku każdej sesji.

Obiekty Figure to okna inne niż okno poleceń widziane na ekranie obiektu root. Obiekty Uicontrol kontrolują uruchamianie funkcji przy użyciu interfejsu użytkownika. Do obiektów tych

zaliczają się przyciski oraz suwaki. Obiekty Axes definiują obszar okna graficznego (okna figure) i orientują jego dzieci w tym obszarze. Obiekty Uimenu to menu interfejsu użytkownika. Rezydują w górnej części okna figure. Image to dwuwymiarowe obiekty, które MATLAB wyświetla używając elementów prostokątnych tablic, jako

indeksów mapy kolorów. Line to podstawowy obiekt graficzny, wykorzystywany przy kreśleniu większości dwuwymiarowych

wykresów. Obiekty Path to wypełnione wielokąty. Każdy obiekt Path może składać się z wielu części (ang. Faces), a

każda z nich może być niezależnie pokryta jednolitym bądź interpolowanym kolorem. Obiekty Surface stanowią trójwymiarowe reprezentacje danych zapisanych w macierzach. Powstają poprzez

kreślenie wartości danych jako wysokości nad płaszczyzną x-y. Obiekty Text to ciągi znaków Obiekty Light definiują źródła świateł.

Uchwyty Obiektów

Każdy obiekt graficzny posiada unikalny identyfikator, zwany uchwytem, który MATLAB przydziela do obiektu podczas jego tworzenia. Niektóre wykresy składają się z wielu indywidualnych obiektów, z których każdy posiada swój uchwyt. Zamiast próbować odczytywać uchwyty z ekranu i przepisywać je, znacznie lepiej jest przechowywać je w postaci zmiennych.

Uchwyt obiektu root to zawsze zero. Uchwytem obiektu figure jest liczba całkowita, która domyślnie wyświetlana jest w pasku tytułowym okna. Uchwyty innych obiektów są liczbami zmiennoprzecinkowymi, zawierającymi informacje wykorzystywane przez MATLAB-a. Na przykład, jeśli A jest magicznym kwadratem Durer’a, wtedy

h = plot (A)

47

Page 48: Starting MATLAB … 2

stworzy wykres zawierający cztery linie, po jednej dla każdej kolumny. Ponadto, powyższe polecenie zwróci wektor uchwytów, takich jak

h = 9.00024414062500 6.00048828125000 7.00036621093750 8.00036621093750

Wartości te nie są stałe i mogą być różne na różnych systemach. Jakiekolwiek te numery są, istotny jest fakt, że h(1) jest uchwytem pierwszej linii z wykresu, h(2) jest uchwytem drugiej linii i tak dalej. MATLAB oferuje kilka funkcji, umożliwiających dostęp do często używanych uchwytów:

gcf gca gco

Możesz używać tych funkcji jako argumentów wejściowych innych funkcji, wymagających uchwytów obiektów figure oraz axes. Wszystkie funkcje MATLAB-a, które tworzą obiekty, zwracają uchwyt (lub wektory uchwytów) tworzonego obiektu.

Aby usunąć obiekt, możesz uzyć funkcji delete, podając jako argument uchwyt tego obiektu. Dla przykładu, usuń bieżący obiekt axes (wraz z jego dziećmi), wpisujac: delete(gca)

Funkcje Tworzące Obiekty

Wywołanie funkcji o nazwie takiej jak nazwa obiektu, tworzy ten obiekt. Na przykład, funkcja text tworzy obiekty typu text, funkcja figure tworzy obiekty typu figure i tak dalej. Funkcje graficzne wysokiego poziomu (jak na przykład plot i surf) wywołują odpowiednie funkcje niskiego poziomu, aby kreślić swoją grafikę.

Funkcje niskiego poziomu po prostu tworzą jeden z jedenastu obiektów graficznych, zdefiniowanych przez MATLAB-a, z wyjątkiem obiektu root, który może być utworzony tylko przez MATLAB-a. Na przykład:

line([1 3 6], [8 -2 0], 'Color', 'red')

Właściwości Obiektów

Wszystkie obiekty posiadają właściwości, które kontrolują sposób ich wyświetlania. MATLAB oferuje dwa mechanizmy, służące do ustawiania tych właściwości. Właściwości obiektu mogą być ustawiane przez funkcję tworzącą go lub też mogą być one zmieniane przez funkcję set, już po utworzeniu obiektu. Poniższy przykład tworzy trzy obiekty i nadpisuje niektóre ich domyślne właściwości.

days = ['Su';'MO';'TU';'We';'Th';'Fr';'Sa'] temp = [21.1 22.2 19.4 23.3 23.9 21.1 20.0]; f = figure a = axes('YLim',[16 26],'Xtick',1 :7,'XTickLabel',days) h = line(1:7,temp)

48

Page 49: Starting MATLAB … 2

days jest tablicą znakową, zawierającą skróty angielskich nazw dni tygodnia, natomiast temp jest tablicą numeryczną typowych temperatur. Okno zostało utworzone poprzez wywołanie funkcji figure bez żadnych argumentów, więc posiada ono domyślne właściwości. Obiekt axes istnieje wewnątrz obiektu figure i posiada określony zakres osi y oraz określone etykiety znaczników na osi x. Obiekt typu line istnieje wewnątrz obiektu typu axis i posiada określone wartości dla danych x i y. Trzy uchwyty obiektów, f, a oraz h zostały zapisane aby można je było wykorzystać później.

set oraz get

Właściwości są ustalane poprzez referencję do obiektu, po jego utworzeniu. Aby tego dokonać, użyj uchwytu zwróconego przez funkcję tworzącą obiekt.

Funkcja set pozwala na ustawianie właściwości dowolnego obiektu, poprzez podanie uchwytu i par w postaci nazwa właściwości/wartość właściwości. Na przykład, aby zmienić kolor i szerokość linii z poprzedniego przykładu,

set(h,'Color',[0 .8 .8],'LineWidth',3)

Aby uzyskać listę wszystkich możliwych do ustawiania właściwości, użyj funkcji set, podając jako argument uchwyt obiektu:

set(h) Color EraseMode: [ {normal} | background | xor | none ] LineStyle: [ {-} | - | : | -. | none ] LineWidth Marker: MarkerSize ... XData YData ZData

Aby uzyskać listę wszystkich bieżących właściwości konkretnego obiektu, użyj funkcji get, podając uchwyt obiektu jako argument :

get(h) Color = [0 0.8 0.8] EraseMOde = normal LineStyle =

49

Page 50: Starting MATLAB … 2

LineWidth = [3] Marker = none MarkerSize = [8] ... XData = [ (1 by 7) double array] YData = [ (1 by 7) double array] ZData = []

Aby uzyskać wartość konkretnej właściwości, użyj funkcji get z nazwą tej właściwości:

get(h,'Color') ans =

0 0.8000 0.8000

Obiekty typu axes posiadają wiele właściwości odpowiadających za całą grafikę. Na przykład, nazwę kolejnego dziecka axes. Polecenia:

t = get(a,'title');

set(t,'String','Temperature','FontAngle','oblique')

ustawiają konkretny tytuł.

Graficzne Interfejsy Użytkownika

Oto prosty przykład, ilustrujący jak można wykorzystać system Handle Graphics do utworzenia interfejsów użytkownika. Poniższe instrukcje

b = uicontrol('Style','pushbutton', ... Units','normalized', ... 'Position',[.5 .5 .2 .1], ... 'String','click here');

tworzą przycisk na środku okna figure i zwracają uchwyt do nowego obiektu. Jednak, na razie klikanie na nowym przycisku nie daje żadnych rezultatów. Instrukcja

s = 'set(b, " Position " ,[.8*rand .9*rand .2 .1])';

tworzy ciąg zawierający komendę, która zmienia położenie przycisku. Kolejne wywołania funkcji

eval(s)

powodują przemieszczanie się przycisku w losowe miejsca. Ostatecznie,

set (b,'Callback',s)

instaluje s jako funkcję przycisku, więc za każdym razem gdy na nim klikniesz, zmieni on swoją lokację.

Animacje

MATLAB oferuje kilka metod generowania ruszającej się, animowanej grafiki. Używanie właściwości EraseMode jest odpowiednie dla długich sekwencji, w których kolejne klatki różnią się minimalnie. Oto przykład symulujący ruchy Browna. Określ ilość punktów, na przykład

n = 20

oraz temperaturę

s = .02

50

Page 51: Starting MATLAB … 2

Najlepsze wartości tych dwóch parametrów zależą od szybkości Twojego komputera. Wygeneruj n losowych punktów o współrzędnych (x,y) z przedziału od – ½ do +½

x = rand(n,1)-0.5; y = rand(n,1)-0.5;

Narysuj punkty w kwadracie o bokach w –1 i +1. Zapisz uchwyt wektora punktów i ustaw jego właściwość EraseMode na xor.

h = plot(x,y,'.'); axis([-1 1 -1 1]) axis squaregrid off set(h,'EraseMOde','xor','MarkerSize',18)

Teraz rozpocznij animację. Oto nieskończona pętla, której działanie możesz przerwać, wciskając <ctrl>-c. Przy każdym przebiegu pętli, do współrzędnych punktów dodawana jest mała ilość losowego szumu. Następnie, zamiast tworzyć całkiem nowy rysunek, po prostu zmieniane są właściwości XData oraz YData poprzedniego rysunku.

while 1 drawnow x = x + s*randn(n,1); y = y + s*randn(n,1); set(h,'XData',x,'YData',y) end

Ile czasu upłynie zanim jeden z punktów wydostanie się poza kwadrat? Ile czasu upłynie zanim zrobią to wszystkie punkty?

Filmy

Jeśli w poprzednim przykładzie ustalisz liczbę punktów na n = 300 oraz s = .02, ruch przestanie być płynny. Zbyt dużo czasu zajmuje narysowanie kolejnej klatki. W takich przypadkach, bardziej efektywne jest zapisanie zdefiniowanej ilości klatek w postaci map bitowych i późniejsze ich odtworzenie jako film.

Najpierw ustal ilość klatek, na przykład

nframes = 50;

51

Page 52: Starting MATLAB … 2

Następnie, utwórz pierwszy rysunek tak jak poprzednio, lecz bez użycia właściwości EraseMode.

x = rand(n,1)-0.5; y = rand(n,t)-0.5; h = plot(x,y,'.') set(h,'MarkerSize',18); axis([-1 1 -1 1]) axis square grid off

Teraz przydziel odpowiednią ilość pamięci, na zapisanie całego filmu,

M = moviein(nframes);

Utworzy to dużą macierz, posiadającą nframes kolumn. Każda kolumna ma wystarczającą długość aby zapisać jedną klatkę. Całkowita ilość potrzebnej pamięci jest proporcjonalna do ilości klatek. Dla 50 klatek potrzeba około 7,5 megabajta.

Wygeneruj film i użyj funkcji getframe aby przechwycić każdą klatkę.

for k = 1:nframes x = x + s*randn(n,1); y = y + s*randn(n,1); set(h,'XData',x,'YData',y) M(:,k) = getframe; end Ostatecznie, odtwórz film 30 razy.

movie(M,30)

52