KURS MATLAB II - Instytut Geofizyki
KURS MATLAB II - Instytut Geofizyki
KURS MATLAB II - Instytut Geofizyki
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>KURS</strong><br />
<strong>MATLAB</strong> <strong>II</strong><br />
Rok 2005/2006, semestr zimowy<br />
Uniwersytet Warszawski<br />
Wydzia! Fizyki<br />
Ryszard Buczy%ski, Rafa! Kasztelanic<br />
1
Spis Tre)ci<br />
Fourierowska analiza danych ............................................................................................... 4<br />
Przetwarzanie dwików ..................................................................................................... 6<br />
Przetwarzanie obrazów – toolbox Image Processing ............................................................ 8<br />
Ca!kowanie numeryczne .................................................................................................... 11<br />
Numeryczne ró$niczkowanie funkcji ................................................................................. 13<br />
Równania ró$niczkowe i ca!kowe ...................................................................................... 14<br />
Obs!uga b!dów ................................................................................................................. 18<br />
Grafika uchwytów ............................................................................................................. 20<br />
Graficzny interfejs u$ytkownika (GUI)............................................................................... 22<br />
Z!o$one struktury danych .................................................................................................. 27<br />
Programowanie zorientowane obiektowo ........................................................................... 29<br />
Obliczenia symboliczne w Matlabie – toolbox Symbolic Math............................................ 32<br />
Wspó!praca Matlaba z innymi 7rodowiskami programistycznymi ...................................... 36<br />
2
<strong>KURS</strong> <strong>MATLAB</strong> <strong>II</strong><br />
Rok 2005/2006 semestr zimowy, wymiar 15h<br />
Prowadz-cy:<br />
dr Ryszard Buczy:ski, ryszard.buczynski@mimuw.edu.pl,<br />
dr Rafa! Kasztelanic, kasztel@mimuw.edu.pl<br />
Zak!ad Optyki Informacyjnej, <strong>Instytut</strong> <strong>Geofizyki</strong>, Wydz. Fizyki UW<br />
Zajcia odbywaj> si w Instytucie <strong>Geofizyki</strong>, ul. Pasteura 7, V pitro, pok. 508. (lub pok. 106)<br />
Oprogramowanie:<br />
Matlab, The MathWorks, Inc.; wersja 7.0; platforma UNIX/LINUX.<br />
Krótki opis kursu:<br />
G!ównym celem kursu jest nauka pos!ugiwania si Matlabem jako narzdziem programistycznym na poziomie<br />
7rednio zaawansowanym. Kurs <strong>MATLAB</strong> <strong>II</strong> jest kontynuacj> kursu <strong>MATLAB</strong> I skoncentrowany na<br />
zagadnieniach zwi>zanych z programowaniem. W programie kursu przewidziane s> równie$ tematy wymagaj>ce<br />
korzystania z dodatkowych modu!ów pakietu Matlab oraz dodatkowych narzdzi programistycznych.<br />
Kurs sk!ada si z 15 godzin zajG komputerowych. Ka$dy student pracuje indywidualnie przy osobnym<br />
terminalu. Wszystkie spotkania rozpoczynaj> si od wprowadzenia merytorycznego do poruszanych zagadnie:.<br />
Dalsza cz7G zajG po7wicona jest na indywidualn> prac z komputerem nad seri> zada:.<br />
Kurs odbywaG si bdzie zarówno w jzyku polskim jak i angielskim.<br />
Forma zaliczenia:<br />
Do zaliczenia Kursu na ocen dostateczn> lub zal. wymagane jest zaliczenie wszystkich Gwicze:-laboratoriów.<br />
Ocena ko:cowa wystawiana jest przez prowadz>cego na podstawie osi>gnitej sprawno7ci i postpów w<br />
pos!ugiwaniu si <strong>MATLAB</strong>em, oraz kreatywno7ci studenta.<br />
Obecno7G na wszystkich zajciach jest obowi>zkowa, dopuszczamy jedna nieobecno7G, przy wikszej ilo7ci<br />
wymagane jest zwolnienie lekarskie. Nieobecno7G nie zwalnia studenta z zaliczenia poszczególnych zada:.<br />
Ostatnia godzina 15-ta jest przeznaczona na wystawianie ocen i ewentualne poprawki.<br />
Wymagania:<br />
<strong>MATLAB</strong> I, znajomo7G algebry, analizy matematycznej i programowania.<br />
Zagadnienia poruszane w ramach kursu <strong>MATLAB</strong> <strong>II</strong>:<br />
Kurs <strong>MATLAB</strong> <strong>II</strong> bazuje na wiedzy zdobytej w trakcie kursu <strong>MATLAB</strong> I. DO g!ównych zagadnie:<br />
poruszanych w trakcie trwania kursu nale$>:<br />
1. Fourierowska analiza danych<br />
2. Przetwarzanie obrazów – toolbox Image Processing<br />
3. Ca!kowanie numeryczne<br />
4. Numeryczne ró$niczkowanie funkcji<br />
5. Równania ró$niczkowe i ca!kowe<br />
6. Obs!uga b!dów<br />
7. Grafika uchwytów<br />
8. Graficzny interfejs u$ytkownika<br />
9. Z!o$one struktury danych<br />
10. Programowanie zorientowane obiektowo<br />
11. Obliczenia symboliczne w Matlabie<br />
12. Wspó!praca Matlaba z innymi 7rodowiskami programistycznymi<br />
Literatura:<br />
1. A. Zalewski, R. Cegie!a, Matlab - obliczenia numeryczne i ich zastosowania.<br />
2. B. Mrozek, Z. Mrozek, Matlab 6 - poradnik u$ytkownika.<br />
3. D. Higham, N. Higham: Matlab guide.<br />
4. The MathWorks, Inc: Numerical Computing with <strong>MATLAB</strong>.<br />
5. http://www.mathworks.com/<br />
3
TEMATY<br />
FOURIEROWSKA ANALIZA DANYCH<br />
Analiza widma funkcji otrzymywanej za pomoc> transformaty Fouriera stanowi podstawi<br />
wikszo7ci algorytmów przetwarzania sygna!ów.<br />
Matlab dostarcza wygodnych narzdzi do takiej analizy.<br />
Temat 1<br />
Jedno wymiarowa transformata Fouriera<br />
Definicja fft(x) gdzie x jest wektorem próbek sygna!u. ifft(x) – oznacza odwrotn><br />
transformat Fouriera.<br />
Wszystkie pochodne funkcji transformaty Fouriera znajduj> si w grupie datafun.<br />
UWAGA: Funkcja fft i jej pochodne najszybciej wykonywana jest dla danych o rozmiarze<br />
bd>cym potg> dwójki, np. 16, 32, 64, itd. Troch wolniej trwaj> obliczenia dla danych o<br />
rozmiarze bd>cym liczb> pierwsz>. Obliczenia dla danych o innych rozmiarach s><br />
zdecydowanie wolniejsze.<br />
Temat 2<br />
Inne pomocne funkcje<br />
fftshift<br />
real<br />
imag<br />
conj<br />
angle<br />
abs<br />
conv<br />
deconv<br />
cov<br />
decimate<br />
interp<br />
unwrap<br />
przesunicie odpowiednich elementów sk!adowych sygna!u<br />
cz7G rzeczywista liczby zespolonej<br />
cz7G urojona liczby zespolonej<br />
sprz$enie zespolone<br />
cz7G fazowa sygna!u<br />
modu! sygna!u<br />
splot dwóch wektorów<br />
dekonvolucja dwóch wektorów<br />
kowariancja<br />
przetworzenie wektora – rzadsze próbkowanie<br />
przetworzenie wektora – gstsze próbkowanie<br />
Uci>glenie fazy<br />
UWAGA: Aby obliczyG warto7G nat$enia sygna!u nale$y skorzystaG z nastpuj>cego<br />
przekszta!cenia:<br />
>> nat = abs(sygnal).^2;<br />
4
Temat 3<br />
Dwu wymiarowa transformata Fouriera Transformata<br />
Z przypadkiem dwu wymiarowej transformaty Fouriera najcz7ciej mamy do czynienia przy<br />
przetwarzaniu zdjG.<br />
Dwu wymiarowa transformata Fouriera – fft2.<br />
Funkcje odwrotne: ifft2, ifftshift.<br />
Przyk!ad:<br />
>> s = rand(128); % stworzenie 2 wymiarowego zbioru danych<br />
>> fs = fftshift(fft2(s)); % 2 wymiarowa transformata Fouriera wraz z przesuni4ciem danych<br />
Temat 4<br />
Wielowymiarowa transformata Fouriera Transformata<br />
Matlab oferuje mo$liwo7G obliczenia wielowymiarowej transformaty Fouriera przy<br />
wykorzystaniu funkcji fftn.<br />
Przyk!ad:<br />
>> s4 = rand(32,32,32,32); % stworzenie 4 wymiarowego zbioru danych<br />
>> fs4 = fftshift(fftn(s4));<br />
Temat 5<br />
Filtry analogowe i cyfrowe<br />
Signal Processing Toolbox udostpnia wiele funkcji zwi>zanych z przetwarzaniem sygna!ów<br />
za pomoc> filtrów. Filtr analogowy, odpowied czstotliwo7ciowa, realizowany jest przy<br />
wykorzystaniu funkcji freqs(a, b, w). Gdzie a i b s> wspó!czynnikami wielomianów a w jest<br />
wektorem z czsto7ciami, dla których prowadzimy analiz.<br />
Filtracj cyfrow>, FIR (sko:czona odpowied impulsowe) lub <strong>II</strong>R (niesko:czona odpowied<br />
impulsowa), wykonuje si za pomoc> funkcji filter(b, a, x). Gdzie b i a s> wspó!czynnikami<br />
odpowiednich wielomianów a w jest wektorem dyskretnych warto7ci sygna!u na wej7ciu<br />
filtra.<br />
Przyk!ad:<br />
>> data = [1:0.2:4]';<br />
>> filter(ones(1,5)/5,1,data); % filtr cyfrowy tyu FIR (u-redniaj/cy)<br />
>> a = [1 0.4 1]; b = [0.2 0.3 1]; w = logspace(-1,1);<br />
>> freqs(b,a,w) % filtr analogowy<br />
5
PRZETWARZANIE D@WIAKU<br />
Przyk!adem sygna!u 1 wymiarowego jest sygna! dwikowy.<br />
Temat 6<br />
Wczytanie pliku dBwiCkowego – funkcja wavread<br />
Do wczytania pliku dwikowego w formacie .wav wykorzystuje si funkcj wavread().<br />
Przyk!ad:<br />
>> y = wavread(‘plik.wav’); % wczytanie pliku d9wi4kowego<br />
>> [y,Fs,bits] = wavread(‘plik.wav’); % zwraca plik d9wi4kowy y, cz4sto-: próbkowania Fs<br />
i liczb4 bitów próbkowania<br />
UWAGA: Do wczytania ci>gu danych niebd>cych plikiem dwikowym s!u$y funkcja load.<br />
Temat 7<br />
Odtworzenie pliku dBwiCkowego – funkcja wavplay<br />
Funkcj> wavplay mo$na odtworzyG jako dwik dowoln> zmienn> bd>c> wektorem liczb<br />
rzeczywistych.<br />
Przyk!ad:<br />
>> wavplay(y); % odtworzenie pliku d9wi4kowego y<br />
>> d = rand(1,20000);<br />
>> wavplay(d); % odtworzenie wektora losowego<br />
>> t = (0:0.001:1)';<br />
>> y = sin(2*pi*50*t) + 2*sin(2*pi*120*t); sygna> o 2 sk>adowych o cz4sto-ciach 50 i 120 Hz<br />
>> wavplay(y) % odtworzenie d9wi4ku y<br />
Temat 8<br />
Zarejestrowanie dBwiCku – funkcja wavrecord<br />
Do zarejestrowania dwiku wykorzystuje si funkcj wavrecord. Funkcja ta mo$e byG<br />
wywo!ywane z kilkoma parametrami:<br />
waverecord(liczba próbek, czsto7G próbkowania, próbkowanie);<br />
Przyk!ad:<br />
>> Fs = 11025;<br />
>> y = wavrecord(5*Fs,Fs,'int16'); % Nagranie 5 sekund z cz4sto-ci/ 11025 Hz i<br />
próbkowaniem 16 bitowym<br />
6
Temat 9<br />
Zapisanie pliku dBwiCkowego – funkcja wavwrite<br />
Do zapisania zarejestrowanego lub zmienionego pliku dwikowego wykorzystuje si funkcj<br />
wavwrite(zmienna z danymi, czsto7G próbkowania, ‘nazwa pliku’)<br />
Przyk!ad:<br />
>> wavwrite(y,11025,’muzyka.wav’); % zapisanie zmiennej y z próbkowaniem 11025 Hz w<br />
pliku muzyka.wav<br />
Temat 10<br />
Generowanie przebiegów czasowych<br />
sawtooth<br />
square<br />
gauspuls<br />
chirp<br />
przebieg trójk>tny (periodyczny)<br />
przebieg prostok>tny (periodyczny)<br />
przebieg sinusoidalny modyfikowany Gaussem (nieperiodyczny)<br />
Przebieg cosinusoidalny o zmiennym okresie<br />
Temat 11<br />
Fourierowska analiza próbek dwikowych – funkcja specgram<br />
Funkcja specgram udostpniona jest w ramach Signal Processing Toolbox.<br />
Zadaniem tej funkcji jest przeprowadzenie analizy czstotliwo7ciowej sygna!u zmiennego w<br />
czasie. Wynikiem dzia!ania funkcji jest obraz, na którego osi poziomej mamy informacje o<br />
czasie a na osi pionowej informacje o czstotliwo7ciach.<br />
Przyk!ad:<br />
>> specgram(y,512,2); % wy-wietla<br />
7
PRZETWARZANIE OBRAZÓW<br />
Przy przetwarzaniu obrazów wygodnie jest korzystaG z Image Processing Toolbox.<br />
Temat 12<br />
Wczytanie obrazka – funkcja imread<br />
Przy wykorzystaniu funkcji imread mo$na wczytaG dowolny, rozpoznawalny przez Matlaba<br />
(cur, gif, ico, tif, png, hdf), plik graficzny.<br />
Przyk!ad:<br />
>> obr = imread('pout.tif’);<br />
UWAGA: Wczytany obrazek jest pamitany jako macierz typu uint8 lub uint16. Czasami w<br />
celu wykonania ró$nych operacji zachodzi potrzeba zmiany typu macierzy na double:<br />
>> obr = double(imread('pout.tif’));<br />
Temat 13<br />
Wy)wietlenie obrazka na ekran<br />
>> imshow(obr) % wy-wietlenie obrazka<br />
>> image(obr) % wy-wietla macierz danych jako obraz<br />
Temat 14<br />
Zapisywanie obrazka – funkcja imwrite<br />
Podstawowe wywo!anie funkcji imwrite sk!ada si z 2 parametrów okre7laj>cych macierz z<br />
danymi oraz nazw pliku. Rozszerzenie nazwy pliku determinuje w jakim formacie zapisany<br />
jest obraz. W wywo!aniu funkcji mo$e si znaleG te$ wicej parametrów odpowiedzialnych<br />
za takie parametry jak palety barw, ilo7G kolorów, przezroczysto7G, kompresje itp.<br />
Przyk!ad:<br />
>> imwrite(obr,'obraz.png’); % nagranie macierzy z danymi obr w pliku obrazowym typu png<br />
Temat 15<br />
Podstawowe operacje na obrazach<br />
imabsdiff<br />
imadd<br />
imdivide<br />
imlincomb<br />
immultiply<br />
imsubtract<br />
ró$nica midzy dwoma obrazami<br />
suma 2 obrazów, plus sta!a<br />
7rednia arytmetyczna z 2 obrazów (piksel po pikselu)<br />
kombinacja liniowa midzy seri> obrazów<br />
iloczyn 2 obrazów<br />
odejmowanie dwóch obrazów, minus sta!a<br />
UWAGA: W przypadku plików typu uint8 lub uint16, dane po ka$dej cz>stkowej operacji s><br />
ucinane do okre7lonego zakresu. Mo$e to powodowaG niezamierzone dzia!ania.<br />
8
Temat 16<br />
Metody poprawiania obrazów<br />
Przyk!ad:<br />
imadjust<br />
fspecial<br />
imfill<br />
histeq<br />
poprawienie kontrastu obrazka<br />
ró$nego rodzaju filtry poprawiaj>ce obraz<br />
wype!nianie dziur w obrazie<br />
poprawienie kontrastu obrazu na podstawie histogramu<br />
>> filtr = fspecial('unsharp'); % generacja filtry wyostrzaj/cego kontury<br />
>> fobr = imfilter(obr,filtr); % zastosowanie zdefiniowanego filtru do obrazu Obr<br />
Temat 17<br />
Przetwarzanie obrazów<br />
Przyk!ad:<br />
imcontour<br />
edge<br />
imfilter<br />
deconv*<br />
imregionalmax<br />
imnoise<br />
znajdowanie konturów obiektów w obrazie<br />
znajdowanie krawdzi w obrazie<br />
splot obrazu z filtrem<br />
szereg funkcji przeprowadzaj>cych dekonvolucj<br />
szukanie lokalnych maksimów w obrazie<br />
dodanie szumu do obrazu<br />
>> filtr = ones(3)/9; % generacja filtru u-redniaj/cego 3x3<br />
>> fobr = imfilter(obr,filtr); % zastosowanie filtru do obrazu<br />
Temat 18<br />
Morfologia matematyczna w przetwarzaniu obrazów<br />
Przyk!ad:<br />
imclose<br />
imopen<br />
imdilate<br />
imerode<br />
strel<br />
imbothat<br />
imtophat<br />
bwmorph<br />
operacja zamknicia morfologicznego<br />
operacja otwarcia morfologicznego<br />
operacja delacji morfologicznej<br />
operacja erozji morfologicznej<br />
tworzenie elementu strukturyzuj>cego<br />
operacja morfologiczna dolny-kapelusz<br />
operacja morfologiczna górny-kapelusz<br />
Operacje morfologiczne na obrazie czarno-bia!ym<br />
>> obr = imread('circles.png'); % wczytanie obrazka czarno-bia>ego<br />
>> elemstr = strel('disk',5); % definicja elementu strukturyzuj/cego , okr/g o promieniu 5<br />
>> erodeobr = imerode(obr,elemstr); % erozja obrazu elementem strukturyzuj/cym<br />
>> obr = bwmorph(BW,'remove')<br />
Temat 19<br />
Inne przydatne funkcje do pracy z obrazami<br />
imhist<br />
improfile<br />
impixel<br />
bwarea<br />
imrotate<br />
imresize<br />
im2bw<br />
histogram obrazu<br />
przekrój przez wiersz lub kolumn obrazu<br />
kolor lub warto7G piksela<br />
liczenie powierzchni obiektu (obraz czarno-bia!y)<br />
obrót obrazu o dowolny k>t<br />
zmiana rozmiaru obrazka<br />
Zamiana obrazka szaroodcieniowego na obraz binarny<br />
9
Temat 20<br />
Filmy w Matlabie<br />
Przyk!ad:<br />
aviread<br />
movie<br />
avifile<br />
getframe<br />
addframe<br />
wczytanie pliku filmowego typu avi<br />
odtworzenie zmiennej typu avi<br />
stworzenie nowego obiektu typu avi<br />
pobranie wntrza okna graficznego jako klatki filmu<br />
dodanie ramki/obrazka do zmiennej typu avi<br />
>> x=1:10; % o- X<br />
>> for j=1:10,<br />
plot(x,j*x,’r’), % w p4tli rysuje kolejne obrazki<br />
axis([0 100 0 10]); % ograniczenie zmienno-ci wy-wietlania osi wykresu<br />
F(j)=getframe; % pobieranie kolejnych klatek<br />
end<br />
>> movie(F,10) % 10 krotne wy-wietlenie animacji<br />
Temat 21<br />
Korelacyjne metody rozpoznawania obrazów<br />
Korelacja jest miar> podobie:stwa midzy 2 obiektami. Mo$na j> wykorzystaG do<br />
rozpoznawania obrazów.<br />
Przyk!ad:<br />
function [w]=rozp1<br />
% scena do filtru<br />
a=double(imread('A.bmp')); % obrazki o rozmiarze 64x64<br />
b=double(imread('B.bmp'));<br />
c=double(imread('C.bmp'));<br />
d=double(imread('D.bmp'));<br />
filtr=zeros(256); % filtr b4dzie wi4kszy 256x256<br />
filtr(128-64-32:128-64+31,128-64-32:128-64+31)=a; % poszczególne litery w 4 :wiartkach<br />
filtr(128+64-32:128+64+31,128-64-32:128-64+31)=b;<br />
filtr(128-64-32:128-64+31,128+64-32:128+64+31)=c;<br />
filtr(128+64-32:128+64+31,128+64-32:128+64+31)=d;<br />
figure, subplot(2,2,1), imshow(filtr) % rysuje co zapami4tane na filtrze<br />
% liczenie filtru<br />
f=fft2(filtr);<br />
filtr=conj(f)./abs(f);<br />
% scena wejsciowa<br />
we=zeros(256);<br />
we(128-32:128+31,128-32:128+31)=a; % litera w -rodku obrazu 256x256<br />
subplot(2,2,2), imshow(we) % rysuje scen4 wej-ciow/<br />
% rozpoznanie – korelacja mi4dzy obrazem wej-ciowym a scen/ na filtrze<br />
p1=fft2(we);<br />
p2=p1.*filtr;<br />
p3=fftshift(ifft2(p2));<br />
wy=abs(p3).^2; % nat4Lenie w p>aszczy9nie wyj-ciowej<br />
subplot(2,2,3), imshow(wy/max(max(wy))) % p>aszczyzna korelacji 2D<br />
subplot(2,2,4), mesh(wy) % p>aszczyzna korelacji 3D<br />
10
CALKOWANIE NUMERYCZNE<br />
Temat 22<br />
Ca!kowanie numeryczne<br />
Problem polega na znalezieniu ca!ki oznaczonej funkcji f(x) na przedziale . Jest to<br />
!atwe, gdy znana jest funkcja pierwotna F(x) taka, $e F(x)’=f(x) nie zawsze jest to jednak<br />
mo$liwe. Metody ca!kowania numerycznego (kwadratury) polegaj> na przybli$eniu funkcji<br />
podca!kowej f na danym przedziale lub jego podprzedzia!ach przy pomocy innej<br />
funkcji, dla której warto7G ca!ki jest okre7lona analitycznie. Matlab stosuje kwadratury<br />
Newtona-Cotesa - quad (interpolacja wielomianem drugiego stopnia) i Simpsona - quadl<br />
(interpolacja wielomianowa – dobierany stopie: wielomianu).<br />
Q=quad(f,a,b,tol,trace);<br />
Q=quadl(f,a,b,tol,trace);<br />
f – !a:cuch zawieraj>cy nazw funkcji, funkcja musi byG umieszczona w odpowiednim<br />
skrypcie, musi zwracaG wektor warto7ci a jej argumentem jest wektor elementów.<br />
a,b – przedzia! ca!kowania,<br />
tol – wymagana tolerancja wzgldna, domy7lnie 10^(-3)<br />
trace – parametr opcjonalny, pozwala na rysowanie wykresu z wz!ami kwadratury.<br />
Przyk!ad 1<br />
function [y] = funkcja_calkowana(x)<br />
%% funkcja<br />
y=sin(x.*x);<br />
%% Koniec<br />
%%Wywo>anie funkcji ca>kowania<br />
>> q1 = quad(‘funkcja_calkowana’,0,pi,1e-5,1);<br />
>> ql = quadl(‘funkcja_calkowana’,0,pi,1e-5,1);<br />
Temat 23<br />
Uchwyt do funkcji – @<br />
Istnieje kilka sposobów wywo!ywania funkcji ca!kowania. Jedn> z nich, wykorzystywan><br />
tak$e w innych przypadkach, jest metoda oparta na uchwycie funkcji. Uchwyt @ mo$na<br />
wykorzystaG do definiowania w!asnych funkcji.<br />
Przyk!ad:<br />
>> srednia = @(x,y) (x+y)/2; % definicja funkcji<br />
>> srednia(5,3) % wywo>anie z linii poleceP Malaba<br />
Wykorzystanie uchwytu @ do ca!kowania funkcji przedstawiono poni$ej.<br />
Przyk!ad:<br />
>> fs = @(x) sin(x);<br />
>> ql = quad1(fs,0,pi,1e-5,1);<br />
11
Temat 24<br />
Inne funkcje zwi-zane z ca!kowaniem numerycznym funkcji<br />
dblquad<br />
trapz<br />
triplequad<br />
obliczanie ca!ek podwójnych<br />
ca!kowanie metod> trapezów<br />
obliczanie ca!ek potrójnych<br />
12
NUMERYCZNE RÓNNICZKOWANIE FUNKCJI<br />
Temat 25<br />
Numeryczne róOniczkowanie funkcji<br />
Przybli$on> warto7G pochodnej mo$na obliczyG przez obliczenie ró$nic pomidzy<br />
warto7ciami tych samych wspó!rzdnych s>siaduj>cych punktów funkcji zadanej<br />
numerycznie. Korzysta si tu z definicji pochodnej funkcji:<br />
d f ( x) f ( x2 ) f ( x1<br />
)<br />
=<br />
dx x2 x1<br />
Do wykonania tej operacji wykorzystuje si funkcj diff(), która oblicza ró$nice pomidzy<br />
s>siaduj>cymi elementami wektora.<br />
Przyk!ad<br />
>> dxdy = diff(y)./diff(x) % y jest wektorem z warto-ciami funkcji w punktach x<br />
Temat 26<br />
Inne funkcje zwi-zane z numerycznym obliczaniem pochodnej.<br />
gradient<br />
del2<br />
Numeryczne obliczenie gradientu funkcji<br />
Laplasian funkcji<br />
13
RÓWNANIA RÓNNICZKOWE<br />
Równania ró$niczkowe, które mamy mo$liwo7G rozwi>zywania w Matlabie mo$na podzieliG<br />
na trzy grupy:<br />
- równania ró$niczkowe zwyczajne gdzie szukamy rozwi>zania równania<br />
ró$niczkowego dla zadanego warunku pocz>tkowego.<br />
- równania ró$niczkowe zwyczajne gdzie szukamy rozwi>zania równania<br />
ró$niczkowego dla zadanych warunków granicznych<br />
- równania ró$niczkowe cz>stkowe<br />
Temat 27<br />
Równania róOniczkowe zwyczajne pierwszego rzCdu<br />
W rozwi>zaniach wielu problemów fizycznych, ekonomicznych wymagana jest znajomo7G<br />
funkcji y=y(t) przy znajomo7ci funkcji y'=f(t, y) oraz warunków pocz>tkowych y(a)=y0,<br />
gdzie a oraz y0 s> liczbami rzeczywistymi a f funkcj> w postaci jawnej. W takim przypadku<br />
mamy do czynienia z równaniem ró$niczkowym zwyczajnym pierwszego rzdu (ordinary<br />
differential equations - ODEs).<br />
Funkcja<br />
ode23<br />
ode45<br />
ode113<br />
ode15s<br />
ode23s<br />
Opis metody<br />
Rozwi>zuje zagadnienie pocz>tkowe dla równa: ró$niczkowych zwyczajnych<br />
metod> Runge-Kutta rzdu 2 i 3<br />
Rozwi>zuje zagadnienie pocz>tkowe dla równa: ró$niczkowych zwyczajnych<br />
metod> Runge-Kutta rzdu 4 i 5<br />
Rozwi>zuje zagadnienie pocz>tkowe dla równa: ró$niczkowych zwyczajnych<br />
metod> Adams-Bashforth-Moulton<br />
Metoda oparta na formule numerycznego ró$niczkowania<br />
Metoda oparta na zmodyfikowanej formule Rosenbrocka 2 rzdu<br />
Podstawowa formu!a rozwiazywania ODE w Matlabie jest nastepujaca:<br />
[t, y] = ode23(fun, tspan, y0,options]<br />
gdzie:<br />
fun – zmienna !a:cuchow> bd>ca nazw funkcji zawieraj>c> rozwi>zywane równanie<br />
ró$niczkowe<br />
tspan – warto7ciami czasu, dla którego poszukiwane jest rozwi>zanie, y0 jest wektorem, w<br />
którym przechowywane s> warto7ci rozwi>zania uk!adu w chwili pocz>tkowej.<br />
Je7li zmienna tspan zawiera wicej ni$ dwa elementy, to metoda zwraca obliczone warto7ci y<br />
dla tych elementów. Parametry wyj7ciowe t i y zawieraj> wektory warto7ci do oblicze: t i<br />
obliczone dla nich warto7ci y.<br />
Warto7ci options s> ustawiane za pomoc> funkcji odeset i pozwalaj> ingerowaG w parametry<br />
rozwi>zywania równania<br />
Analogicznie rozwi>zuje si równania ró$niczkowe dla metody ode45.<br />
14
Przyk!ad:<br />
Szukamy rozwi>za: numerycznych y = y(t) dla warto)ci t = 0, .25, .5, .75, 1 dla równania<br />
ró$niczkowego y' = -2ty 2 , przy warunku pocz>tkowym y(0) = 1. Zastosowane zostan> dwie<br />
metody ode23 i ode45.<br />
Powy$szy problem ma rozwi>zanie analityczne y(t) = 1/(1 + t2) co pozwoli porównaG<br />
otrzymane wyniki numeryczne z wynikami analitycznymi.<br />
>> %% definicja rozwi/zywanego równania róLniczkowego y' = -2ty^2<br />
function dy = eq1(t,y)<br />
dy = -2*t.*y(1).^2;<br />
%% rozwi/zanie równania róLniczkowego zwyczajnego<br />
>> format long<br />
>> tspan = [0 .25 .5 .75 1]; y0 = 1; % warto-ci dla których liczymy i warunki pocz/tkowe<br />
>> [t1 y1] = ode23('eq1', tspan, y0); % metoda ode23<br />
>> [t2 y2] = ode45('eq1', tspan, y0); % metoda ode45<br />
>> [t1 y1 y2] % porównanie wyników osi/gni4tych obiema metodami<br />
Przyk!ad:<br />
W poni$szym przyk!adzie szukamy rozwi>za: numerycznych uk!adu równa: ró$niczkowych<br />
pierwszego stopnia:<br />
y 1( t) = y1( t) 4y2( t)<br />
<br />
y2 () t = y1() t + y2()<br />
t<br />
przy warunkach pocz>tkowych:<br />
y1( 0) = 1, y2( 0)<br />
= 0.<br />
Zastosowana zostanie metoda ode23.<br />
Powy$szy problem ma rozwi>zanie analityczne<br />
1<br />
y1<br />
= exp ( ) exp ( 3 )<br />
2<br />
t + t <br />
1<br />
y2<br />
= exp( 3t) + exp( t)<br />
<br />
4<br />
<br />
<br />
co pozwoli porównaG otrzymane wyniki numeryczne z wynikami analitycznymi.<br />
%% definicja rozwi/zywanego uk>adu równaP róLniczkowych za pomoc/ funkcji inline<br />
>> dy = inline('[1 –4;-1 1]*y', 't', 'y')<br />
>> tspan = [0 1]; % przedzia> dla którego szukamy rozwi/zaP<br />
>>y0 = [1 0]; % warunki pocz/tkowe<br />
>>[t,y] = ode23(dy, tspan, y0); % metoda ode23<br />
>>plot(t,y(:,1),t,y(:,2),'--'), legend('y1','y2'), xlabel('t'), ...<br />
ylabel('y(t)'), title('Numerical solutions y_1(t) and y_2(t)') % zobrazowanie wyników<br />
15
Przyk!ad:<br />
W poni$szym przyk!adzie szukamy rozwi>zania numerycznego uk!adu równa:<br />
rózniczkowych dla równania Eulera dla bry!y sztywnej bez si! zewnetrzych:<br />
y 1<br />
= y2y3<br />
<br />
y2 = y1y3<br />
<br />
y<br />
= 0,51y y<br />
3 1 2<br />
function dydt = f(t,y) %% zapisujemy równia Eulera<br />
dydt = [y(2)*y(3); -y(1)*y(3); -0.51*y(1)*y(2)];<br />
>> tspan = [0 12]; % przedzia>, dla którego szukamy rozwi/zaP<br />
>> y0 = [0; 1; 1]; warunki pocz/tkowe<br />
>> ode45(@f,tspan,y0); % metoda ode45<br />
Temat 28<br />
Równania róOniczkowe zwyczajne wyOszego rzCdu<br />
Matlab pozwala równie$ na rozwi>zywanie równa: ró$niczkowych wy$szego rzdu. W tym<br />
przypadku trzeba jednak zapisaG równanie w postaci uk!adu równa: ró$niczkowego<br />
pierwszego rzdu.<br />
y = f ( t,<br />
y)<br />
Dowolne równanie ró$niczkowe wy$szego rzdu<br />
( n) ( n 1)<br />
y = f t, y, y,...,<br />
y <br />
( )<br />
mo$na zapisaG jako uk!ad równa: pierwszego rzdu stosuj>c podstawienie<br />
( n 1)<br />
y1 = y, y2<br />
= y,...,<br />
yn<br />
= y <br />
Wtedy dostaniemy uk!ad n równani ró$niczkowych pierwszego rzdu:<br />
y 1<br />
= y2<br />
y 2<br />
= y3<br />
<br />
<br />
<br />
<br />
y n<br />
= f ( t, y1, y2,...,<br />
yn)<br />
16
Przyk!ad:<br />
W poni$szym przyk!adzie szukamy rozwi>zania numerycznego równania ró$niczkowego<br />
drugiego stopnia van der Pola<br />
2<br />
yµ<br />
1 y y<br />
+ y = 0<br />
( )<br />
1 1 1 1<br />
Przyjmuj>c podstawienie<br />
y 1<br />
= y2<br />
otrzymujemy uk!ad równa: pierwszego stopnia w postaci:<br />
y 1<br />
= y2<br />
2<br />
y2 µ ( 1 y1 ) y2 y1<br />
function dydt = f(t,y,mu) % funkcja w której zapisali-my równanie róLniczkowe<br />
dydt = [y(2); mu*(1-y(1)^2)*y(2)-y(1) ];<br />
>> Mu=100; % przyjmujemy parametr T<br />
>> tspan = [0; max(20,3*MU)]; % przedzia>, dla którego szukamy rozwi/zaP<br />
>> y0 = [2; 0]; %warunki pocz/tkowe<br />
>> [t,y] = ode15s(@f,tspan,y0); % metoda ode15s<br />
>> plot(t,y(:,1)); % zobrazowanie wyników<br />
>> title(['Solution of van der Pol Equation, \mu = ' num2str(MU)]);<br />
>> xlabel('time t');<br />
>> ylabel('solution y_1');<br />
>> axis([tspan(1) tspan(end) -2.5 2.5]);<br />
17
OBSLUGA BLADÓW<br />
Temat 29<br />
Komunikat b!Cdu – funkcja error<br />
Funkcja error wypisuje komunikat b!du: error(‘to jest b!>d’)<br />
W celu wyprowadzenia na ekran komunikatu o b!dzie w postaci okienka nale$y u$yG funkcji<br />
errordlg(´errorstrin´,´dlgname´).<br />
Przyk!ad:<br />
>> error(‘Cos jest nie tak’);<br />
>> errordlg(‘Cos jest nie tak’,’Komunikat o b>4dzie’);<br />
Temat 30<br />
Komunikat ostrzeOenia – funkcja warning<br />
Wypisuje komunikat ostrze$enia.<br />
Przyk!ad:<br />
>> warning(‘to jest ostrzeLenie’);<br />
Temat 31<br />
Zmienne standardowe: nargin, nargout<br />
Liczba parametrów w definicji funkcji mo$e si ró$niG od liczby parametrów, jak> podaje<br />
u$ytkownik. Zmienna standardowa nargin okre7la dla danego wywo!ania funkcji z iloma<br />
parametrami funkcja ta zosta!a wywo!ana. Odpowiednio, zmienna nargout okre7la ile<br />
parametrów wyj7ciowych zostanie pobranych przez u$ytkownika.<br />
Przyk!ad:<br />
function [y1, y2, y3, y4]=funkcja_x(x1, x2, x3, x4)<br />
%% [y1, y2, y3, y4]=funkcja_x(x1, x2, x3, x4)<br />
% y1 ...y4 parametry wyj-ciowe funkcji<br />
% x1....x4 parametry wej-ciowe funkcji<br />
if (nargin1)<br />
y2 = ....<br />
y3= ......<br />
y4= ......<br />
% koniec funkcji<br />
18
Zmienne nargin, nargout mog> byG wykorzystywane do sprawdzania poprawno7ci liczby<br />
wprowadzonych lub wyprowadzanych zmiennych z funkcji.<br />
Przyk!ad:<br />
function funk(x,y)<br />
if nargin ~= 2<br />
error('Wrong number of input arguments')<br />
end<br />
UWAGA: Do wprowadzania i wyprowadzania dowolnej liczby dowolnych elementów do i z<br />
funkcji wykorzystuje si odpowiednio funkcj varargin oraz funkcj varargout.<br />
Temat 32<br />
Reagowanie na nieprawid!owy argument funkcji<br />
Do sprawdzenia czy dana zmienna ma oczekiwan> przez nas postaG wykorzystujemy<br />
operatory typu is*.<br />
Przyk!ad:<br />
ischar<br />
isempty<br />
isequal<br />
isglobal<br />
isinteger<br />
islogical<br />
isnan<br />
isnumeric<br />
isprime<br />
isreal<br />
isscalar<br />
issorted<br />
issparse<br />
isvector<br />
if ~isreal(arg2),<br />
error(‘Zmienna musi by: liczb/ rzeczywist/’)<br />
end<br />
Sprawdza czy dana wej7ciowa jest zmienn> typu char<br />
Sprawdza czy dana wej7ciowa jest zmienn> pust><br />
Sprawdza czy dane 2 macierze s> sobie równe<br />
Sprawdza czy dana wej7ciowa jest zmienn> globaln><br />
Sprawdza czy wszystkie elementy ziennej s> typu integer<br />
Sprawdza czy dana wej7ciowa jest zmienn> logiczn><br />
Znajduje elementy niesko:czone (NaN)<br />
Sprawdza czy dana wej7ciowa jest zmienn> numeryczn><br />
Znajduje elementy bd>ce liczbami pierwszymi<br />
Sprawdza czy wszystkie elementy zmiennej s> typu real<br />
Sprawdza czy dana wej7ciowa jest skalarem<br />
Sprawdza czy dana wej7ciowa jest posortowana<br />
Sprawdza czy dana wej7ciowa jest macierz> rzadk><br />
Sprawdza czy dana wej7ciowa jest wektorem<br />
>> a = 1:20; % zmienna wej-ciowa<br />
>> p = isprime(a); % wektor z 1 tam gdzie dana liczba jest pierwsza<br />
19
GRAFIKA UCHWYTÓW<br />
Temat 33<br />
Uchwyt<br />
Ka$dy element graficzny wy7wietlony w oknie wykresu ma swój uchwyt. Wykorzystuj>c<br />
uchwyty mo$emy mieG dostp do wszystkich elementów okna graficznego.<br />
W celu uzyskania g!ównych uchwytów stosujemy funkcj findobj.<br />
Przyk!ad:<br />
>> plot(1:10,’o-’) % otworzenie okna graficznego i wyrysowanie linii prostej<br />
>> h = findobj; % szukam g>ównych uchwytów<br />
% warto-ci zwrócone przez Matlaba<br />
h = 0<br />
1.0000<br />
73.0011<br />
1.0050<br />
Aby uzyskaG te dane w bardziej zrozumia!ej formie stosujemy nastpuj>c> sk!adni:<br />
>> get(h,’type’)<br />
ans = ’root’<br />
‘figure’<br />
‘axes’<br />
‘line’<br />
W tej chwili wywo!anie np. h(4) daje nam uchwyt do obiektu Line.<br />
Temat 34<br />
Parametry obiektów graficznych<br />
W celu wy7wietlenia listy dostpnych parametrów danego elementu wykresu korzystamy z<br />
funkcji set.<br />
>> set(h(4))<br />
Aby uzyskaG opcje danego sk!adnika pojedynczego elementu graficznego korzystamy z<br />
nastpuj>cej sk!adni:<br />
>> set(h(4),’Marker’) % s>ówko Marker okre-la interesuj/cy nas sk>adnik<br />
Lista parametrów dostpna jest w opisie danego elementu graficznego.<br />
20
Temat 35<br />
Ustawianie parametrów graficznych – funkcja set<br />
Maj>c uchwyt do danego elementu graficznego mo$emy zmieniG jego parametry.<br />
W tym celu korzystamy z funkcji set(uchwyt, parametr,’warto,-)<br />
Przyk!ad:<br />
>> set(h(4), ‘Marker’, ‘s’, ‘MarkerSize’, 16) % kwadratowy marker (‘s’) o wielko-ci 16<br />
Temat 36<br />
Pobieranie bieO-cych parametrów obiektów graficznych – funkcja get<br />
Maj>c uchwyt do danego elementu graficznego mo$emy sprawdziG jego parametry.<br />
W tym celu korzystamy z funkcji get(uchwyt,parametr).<br />
>> get(h(4),’Marker’);<br />
Temat 37<br />
Inne funkcje zwi-zane z grafik- uchwytów<br />
reset<br />
delete<br />
drawnow<br />
findobj<br />
copyobj<br />
Przywraca domy7lne parametry obiektu<br />
Usuwa obiekt<br />
Wykonuje zaleg!e operacje graficzne<br />
Szuka obiektu o zadanych parametrach<br />
Tworzy kopi obiektu<br />
Temat 38<br />
BieO-ce okno graficzne<br />
W przypadku aktywnego okna graficznego Matlab udostpnia 3 predefiniowane uchwyty:<br />
gca<br />
gcf<br />
gco<br />
Uchwyt do osi wspó!rzdnych<br />
Uchwyt do okna graficznego<br />
Uchwyt do bie$>cego obiektu<br />
Temat 39<br />
Inne funkcje zwi-zane z obs!ug- okien graficznych<br />
figure<br />
clf<br />
shg<br />
close<br />
refresh<br />
cla<br />
Utworzenie nowego okna graficznego<br />
Czyszczenie okna graficznego<br />
Pokazuje ostatnie okno graficzne<br />
Zamyka bie$>ce okno graficzne<br />
Od7wie$a zawarto7G bie$>cego okna graficznego<br />
Czy7ci zawarto7G uk!adu wspó!rzdnych<br />
21
GRAFICZNY INTERFEJS UNYTKOWNIKA<br />
Temat 40<br />
Tworzenie graficznego interfejsu uOytkownika – funkcja guide<br />
Pisz>c aplikacje na w!asny u$ytek czsto zapominamy o przyjaznym interfejsie. Jednak ze<br />
wzgldu na funkcjonalno7G, !atwo7G obs!ugi i w przypadku, gdy z naszego programu maj><br />
korzystaG tak$e inni u$ytkownicy dobrze jest dodaG do aplikacji graficzny interfejs<br />
u$ytkownika.<br />
Aby rozpocz>G tworzenia takiego interfejsu nale$y wywo!aG funkcj guide.<br />
Po otworzeniu si okna dialogowego nale$y wybraG rodzaj tworzonego przez nas okna oraz<br />
katalog w którym ma byG ono zapisane.<br />
UWAGA: Matlab automatycznie wygeneruje 2 pliki. W jednym *.fig trzymana jest<br />
informacja o wygl>dzie interfejsu a w drugim *.m szablon funkcji, któr> bdzie wykonywa!<br />
interfejs.<br />
Temat 41<br />
Okno edytora graficznego interfejsu uOytkownika.<br />
Do g!ównych elementów okna edytora graficznego nale$>: menu, pasek narzdzi, elementy<br />
interfejsu oraz obszar roboczy.<br />
Do najwa$niejszych elementów paska narzdzi nale$>:<br />
ikona M-file editor – dostp do kodu tworzonego interfejsu<br />
run – uruchamianie tworzonego interfejsu<br />
Temat 42<br />
Praca nad interfejsem uOytkownika.<br />
Prace nad interfejsem u$ytkownika mo$na podzieliG na kilka etapów. Do najwa$niejszych<br />
nale$>: projektowanie, ustawianie elementów, w!a7ciwo7ci elementów, programowanie,<br />
testowanie.<br />
Temat 43<br />
DostCpne elementy interfejsu uOytkownika.<br />
Matlab oferuje kilka elementów graficznych, które mog> si znaleG w oknie tworzonego<br />
interfejsu u$ytkownika. Nale$> do nich:<br />
push button<br />
slider<br />
radio button<br />
checkbox<br />
edit text<br />
static text<br />
popup menu<br />
list box<br />
toggle button<br />
axes<br />
panel<br />
button group<br />
activeX control<br />
przycisk dzia!aj>cy po naci7niciu go myszk><br />
suwak<br />
wybór 1 opcji z kilku<br />
pole wyboru. Mo$liwy wybór kilku opcji jednocze7nie<br />
pole edycji<br />
tekst bez mo$liwo7ci jego edycji<br />
menu podrczne aktywowane po naci7niciu prawym przyciskiem myszki<br />
rozwijana lista wyboru<br />
przycisk, który mo$na wcisn>G na sta!e<br />
uk!ad wspó!rzdnych<br />
obszar do ustawiania pogrupowanych innych elementów<br />
obszar do ustawiania grupy przycisków tego samego typu<br />
kontrolka activeX<br />
22
Temat 44<br />
Ustawianie elementów i ich w!a)ciwo)ci.<br />
W celu umieszczenia danego elementu interfejsu u$ytkownika na obszarze pola roboczego<br />
nale$y wskazaG ten element a nastpnie nacisn>G (lub przeci>gn>G) w obrbie pola roboczego.<br />
Elementy mo$na przesuwaG i wyrównywaG z innymi. Dostp do parametrów elementu<br />
mo$liwy jest po dwukrotnym klikniciu lub w menu podrcznym danego elementu.<br />
Temat 45<br />
W!a)ciwo)X obiektu Tag<br />
Jednym z najwa$niejszych w!asno7ci ka$dego elementu interfejsu u$ytkownika jest pole Tag.<br />
Warto7G tekstowa wpisana w to pole daje dostp do danego elementu oraz pozwala na<br />
reagowanie na wszelkie akcje zwi>zane z tym elementem (funkcja callback).<br />
Temat 46<br />
ZapamiCtanie interfejsu uOytkownika<br />
Po etapie projektowania interfejsu u$ytkownika wygodnie jest zapamitaG rezultaty naszej<br />
pracy. Matlab automatycznie wygeneruje 2 pliki. W jednym *.fig trzymana jest informacja o<br />
wygl>dzie interfejsu a w drugim *.m szablon funkcji, któr> bdzie wykonywa! interfejs.<br />
Temat 47<br />
Reagowanie na akcje uOytkownika – funkcja callback<br />
Wygenerowane w czasie zapisywania pliki zawieraj> obs!ug wszystkich zdarze: zwi>zanych<br />
z wywo!ywaniem naszego interfejsu i wykonywaniem go w 7rodowisku Matlaba. Pozostaje<br />
teraz zdefiniowaG wszystkie funkcje zwi>zane z interakcj> u$ytkownika z projektowanym<br />
interfejsem i programem.<br />
W tym celu z cz7ci> elementów wystpuj>c> w oknie interfejsu np. przyciskiem nale$y<br />
skojarzyG jak>7 funkcj, która bdzie wykonywana po jego naci7niciu. W tym celu nale$y<br />
dla danego elementu zdefiniowaG funkcj callback.<br />
Mo$na to wykonaG albo w oknie Property Inspektor danego elementu lub po naci7niciu<br />
danego elementu prawym przyciskiem myszki.<br />
Po stworzeniu funkcji callback w kodzie programu pojawi si odpowiadaj>cy jej nag!ówek<br />
funkcji. Rol> projektanta interfejsu jest wpisanie w dalszej cz7ci programu instrukcji jakie<br />
maj> zostaG wykonane.<br />
Przyk!ad:<br />
Za!ó$my, $e w interfejsie u$ytkownika mamy zdefiniowane dwa elementy: PushButton (Tag<br />
= Przycisk) oraz StaticText (Tag = Tekst). Zadaniem elementu tekstowego jest wy7wietlanie<br />
informacji o liczbie naci7niG przycisku.<br />
function Przycisk_Callback(hObject, eventdata, handles)<br />
% hObject handle to Przycisk (see GCBO)<br />
% eventdata reserved - to be defined in a future version of <strong>MATLAB</strong><br />
% handles structure with handles and user data (see GUIDATA)<br />
persistent ile % definicja zmiennej w której trzymamy liczb4 naci-ni4: przycisku<br />
if isempty(ile) % je-li nie ma Ladnej warto-ci to przypisuj4 warto-: 0<br />
ile=0;<br />
end<br />
ile = ile + 1; % reakcja na naci-ni4cie. Zwi4kszam licznik o 1<br />
str=['Liczba nacisniec: ', Int2Str(ile)]; % tekst do wy-wietlenia<br />
set(handles.tekst,'String',str); % przypisanie w>a-ciwo-ci do pola String obiektowi tekst<br />
23
Temat 48<br />
Zmienne w programie<br />
Dobr> praktyk> jest definiowanie tych zmiennych, które maj> ulegaG modyfikacji w trakcie<br />
dzia!ania programu w ramach uchwytów. Funkcje callback maj> pe!ny dostp do wszystkich<br />
elementów programu zdefiniowanych w uchwycie.<br />
Przyk!ad:<br />
% Choose default command line output for untitled1<br />
handles.output = hObject;<br />
% DODANE<br />
handles = guihandles(hObject); % pobranie uchwytu do ca>ego okna interfejsu<br />
handles.ile = 0; % dodanie nowego elementu do uchwytu i nadanie mu warto-ci<br />
% KONIEC DODANEGO<br />
% Update handles structure<br />
guidata(hObject, handles); % zapami4tanie uchwytu<br />
%<br />
function Przycisk_Callback(hObject, eventdata, handles)<br />
% hObject handle to Przycisk (see GCBO)<br />
% eventdata reserved - to be defined in a future version of <strong>MATLAB</strong><br />
% handles structure with handles and user data (see GUIDATA)<br />
handles.ile = handles.ile + 1; % zwi4kszenie licznika o jeden<br />
guidata(hObject, handles); % zapami4tanie nowej warto-ci uchwytu<br />
str=['Liczba nacisniec: ', Int2Str(handles.ile)]; % tekst do wy-wietlenia<br />
set(handles.tekst,'String',str); % przypisanie w>a-ciwo-ci do pola String obiektowi tekst<br />
Temat 49<br />
Wykonanie programu ze zdefiniowanym interfejsem uOytkownika<br />
W celu wykonania programu z interfejsem u$ytkownika nale$y w oknie komend wpisaG<br />
nazw funkcji z interfejsem.<br />
Temat 50<br />
Interfejs graficzny – EditBox<br />
Przyk!ad:<br />
function edit1_Callback(hObject, eventdata, handles)<br />
str = get(handles.edit1, ‘String’); % pobranie tekstu z elementu Edit1<br />
set(handles.edit1, ‘String’, str); % ustawienie tekstu w obiekcie Edit1<br />
24
Temat 51<br />
Interfejs graficzny – ToggleButton<br />
Przyk!ad:<br />
function togglebutton1_Callback(hObject, eventdata, handles)<br />
stan = get(handles.togglebutton1,’Value’); % pobranie stanu przycisku togglebutton1<br />
if stan==0,<br />
… % klawicz wy>/czony<br />
else<br />
… % klawisz w>/czony<br />
end;<br />
Temat 52<br />
Interfejs graficzny – RadioButton<br />
W Matlabie pola RadioButton nie s> ze sob> powi>zane. Oznacza to, $e obs!ug tych<br />
elementów polegaj>c> na w!>czaniu lub wy!>czaniu odpowiednich pól RadioButton musi<br />
przeprowadziG u$ytkownik.<br />
Przyk!ad:<br />
function radiobutton1_Callback(hObject, eventdata, handles)<br />
set(handles.radiobutton1,’Value’,1); % W>/czenie zaznaczenia pola RadioButton1<br />
set(handles.radiobutton2,’Value’,0); % Wy>/czenie zaznaczenia pola RadioButton2<br />
Temat 53<br />
Interfejs graficzny – ListBox<br />
Wszystkie opcje dostpne do wyboru w obiekcie ListBox s> dostpne we w!a7ciwo7ci<br />
‘String’.<br />
Przyk!ad:<br />
function listbox1_Callback(hObject, eventdata, handles)<br />
opcja = get(handles.listbox1, ‘Value’); % pobranie numeru wybranej linii<br />
str = [‘Opcja’, num2str(opcja)]; % zmienna tekstowa z informacj/ o wybranej opcji<br />
tresc = get(handles.listbox1, 'String'); % pobranie wszystkich linii tekstu z listbox1<br />
set(handles.text1, 'String', str(opcja)); % wy-wietlenie w obiekcie text1 (StaticText) tekstu z<br />
% wybranej linii obiektu listbox1<br />
UWAGA: Z podobn> obs!ug> mamy do czynienia w przypadku Pop-up Menu.<br />
Temat 54<br />
Interfejs graficzny – Slide<br />
Po!o$enie suwaka okre7lone jest liczb> z przedzia!u od 0.0 do 1.0.<br />
Przyk!ad:<br />
function slider1_Callback(hObject, eventdata, handles)<br />
polozenie = get(handles.slider1, ‘Value’); % pobranie informacji o po>oLeniu suwaka<br />
25
Temat 55<br />
Interfejs graficzny – Axes<br />
Za!ó$my, $e w oknie interfejsu graficznego mamy 2 elementu. Przycisk (PushButton) i<br />
Wykres (Axes). Naci7nicie przycisku powoduje wy7wietlenie na wykresie okrgu.<br />
Przyk!ad:<br />
function przycisk_Callback(hObject, eventdata, handles)<br />
t=0:0.01:2*pi; x=cos(t); y=sin(t); % dane do wykresu<br />
axes(handles.wykres) % pobranie uchwytu do wykresu<br />
plot(x,y,’r’) % wyrysowanie ko>a<br />
Temat 56<br />
Okna do wprowadzania danych – funkcja inputdlg<br />
Prost> metod> zrobienia prostego interfejsu do wprowadzania danych jest skorzystanie z<br />
funkcji inputdlg.<br />
Przyk!ad:<br />
pyt{1} = ’Zmienna X:’; % Tekst przy polu do wprowadzenia zmiennej 1<br />
pyt{2} = ’Zmienna Y:’; % Tekst przy polu do wprowadzenia zmiennej 2<br />
tytul = ‘Moje Okno’; % nazwa okna<br />
odp = {‘5’,’7’}; % opcjonalne warto-ci domy-lne<br />
wynik = inputdlg(pyt, tytul, 1, odp); % wywo>anie okna dialogowego<br />
26
ZLONONE STRUKTURY DANYCH<br />
Temat 57<br />
Struktury<br />
Struktury w Matlabie s!u$> do przechowywania danych ró$nych typów i ró$nych wielko7ci w<br />
obrbie jednej macierzy. Jest to zbiór takich samych rekordów.<br />
Przyk!ad definiowania struktury danych typu student:<br />
>> student(1).nazwisko = ‘Abacki’;<br />
>> student(1).wiek = ‘20’;<br />
>> student(1).dane = rand(3);<br />
>> student(2).nazwisko = ‘Babacki’;<br />
>> student(2).wiek = ‘22’;<br />
>> student(2).dane = randn(3);<br />
Temat 58<br />
Definiowania struktury przy wykorzystaniu funkcji struct<br />
Do definiowania danych zorganizowanych w struktur wykorzystujemy funkcj struct.<br />
Przyk!ad:<br />
>> student = struct(‘nazwisko’,{‘Abacki’,’Babcki’},…<br />
‘wiek’,{20,22},…<br />
‘dane’,{rand(3),randn(3)});<br />
Takie definiowanie struktury daje mo$liwo7G wcze7niejszej alokacji pamici co wp!ywa na<br />
szybko7G wykonywania operacji:<br />
>> student = repmat(struct('nazwisko',{''},'wiek',{''},'dane',{''}),10,1);<br />
% alokacja pami4ci dla 10 studentów<br />
UWAGA: Funkcja repmat s!u$y do powielania elementów.<br />
Temat 59<br />
Wy)wietlanie danych ze struktury<br />
Ze wzgldu na fakt, $e w pojedynczej strukturze mog> byG zapisane elementy o ró$nym<br />
stopniu zag!bienia, do wy7wietlania poszczególnych danych wykorzystuje si ró$n><br />
sk!adni.<br />
Przyk!ad:<br />
>> student % Nazwa struktury. Wy-wietlenie nazw pól<br />
>> student(1) % Wy-wietlenie danych dla danego rekordu<br />
>> student(2).wiek % Wy-wietlenie konkretnej danej<br />
>> celldisp(student) % Wy-wietlenie ca>o-ci danych dla struktury student<br />
27
Temat 60<br />
Macierz komórek – cell array<br />
G!ówna ró$nica midzy struktur> a macierz> komórek jest fakt, $e w macierzy komórek<br />
odwo!ujemy si do poszczególnych elementów za pomoc> adresu a nie za pomoc> nazwy<br />
elementu.<br />
Macierz komórek mo$na rozumieG jako macierz, gdzie ka$dy element macierzy mo$e byG<br />
inn> macierz>, zmienn> lub struktur>.<br />
Przyk!ad:<br />
>> A = {1:5, pi; rand(3), ‘tekst’}<br />
A =<br />
[1x5 double] [3.1416]<br />
[3x3 double] 'tekst'<br />
Temat 61<br />
Definiowania macierzy komórek przy wykorzystaniu funkcji cell.<br />
Przyk!ad:<br />
>> a = cell(2,2); % definicja macierzy komórek o rozmiarze 2x2 z pustymi komórkami<br />
Takie definiowanie macierzy komórek daje mo$liwo7G wcze7niejszej alokacji pamici, co<br />
wp!ywa na szybko7G wykonywania operacji.<br />
Temat 62<br />
Wy)wietlanie danych z macierzy komórek.<br />
Wy7wietlanie danych z macierzy komórek jest podobne jak przy wy7wietlaniu elementów<br />
zwyk!ej macierzy z t> ró$nic>, $e teraz korzystamy z nawiasów { }.<br />
Przyk!ad:<br />
>> a{1,1} % Wy-wietlenie pojedynczego elementu<br />
>> a{2,:} % Wy-wietlenie kolumny elementów<br />
>> celldisp(a) % Wy-wietlenie ca>o-ci danych<br />
>> cellplot(a) % Graficzne przedstawienie danych<br />
Temat 63<br />
Konwersja typów miCdzy struktur- a macierz- komórek<br />
Przyk!ad:<br />
struct2cell<br />
cell2struct<br />
zamiana struktur na macierz komórek<br />
zamiana macierz> komórek na struktur<br />
>> a = {1:5, pi; 1:10, 4*3}; % Zdefiniowanie macierzy komórek<br />
>> pola = {‘wektor’,’liczba’}; % zdefiniowanie nazwy pól<br />
>> cell2struct(a,pola,2); % Zamiana macierzy komórek na struktur4<br />
28
PROGRAMOWANIE ZORIENTOWANE OBIEKTOWO<br />
Temat 64<br />
Definiowanie klas - konstruktor<br />
Konstruktor danej klasy musi byG umieszczony w funkcji o nazwie nazwa_klasy.m. Musi si<br />
on znajdowaG w osobnym folderze o nazwie @nazwa_klasy. W folderze tym musz> te$<br />
znajdowaG si wszystkie metody (funkcje i operatory) dzia!aj>ce na elementach danej klasy.<br />
Dostp do klasy maj> tylko te funkcje.<br />
Zadaniem konstruktora jest: sprawdzenie czy przy wywo!aniu konstruktora dane s> warto7ci<br />
pól obiektu i je7li nie to stworzenie obiektu pustego, sprawdzenie czy dane s> obiektem danej<br />
klasy, lub wstawienie domy7lnych parametrów do pól tworzonego obiektu.<br />
Przyk!ad:<br />
function c=czlowiek(dane)<br />
% konstruktor cz>owiek.m dla klasy obiektów ‘czlowiek’<br />
% zapisane w katalogu @czlowiek<br />
if nargin==0 % brak parametrów wywo>ania<br />
c.imie = [ ];<br />
c.plec = [ ];<br />
c.wiek = [ ];<br />
c = class(c,’czlowiek’); % utworzenie pustego obiektu ‘cz>owiek’<br />
elseif isa(dane,’czlowiek’) % funkcja isa sprawdza czy dana naleLy do klasy czlowiek<br />
c = dane; % dane wej-ciowe s/ obiektem typu ‘czlowiek’<br />
else<br />
c.imie = dane(1);<br />
c.plec = dane(2);<br />
c.wiek = dane(3);<br />
c = class(c,’czlowiek’); % tworzony obiekt ‘czlowiek’ z polami wype>nionymi danymi ‘dane’<br />
end<br />
Temat 65<br />
Tworzenie obiektu<br />
>> Jacek = cz>owiek({‘Jacek’,’m’,26});<br />
Temat 66<br />
Hermetyzowanie danych<br />
Dostp do danych w polach obiektu i mo$liwo7ci operowania nimi maj> tylko wy!>cznie<br />
metody danej klasy.<br />
Do wy7wietlenia nazwy pól obiektu wykorzystuje si funkcj fieldnames.<br />
Przyk!ad:<br />
>> fieldnames(Jacek) % wy-wietli nazwy pól obiektu Jacek<br />
>> Jacek.plec % BefD, brak dost4pu do danych<br />
29
Temat 67<br />
Metody obs!ugi obiektów<br />
Zadaniem metody emeryt jest sprawdzenie czy dany cz!owiek jest w wieku emerytalnym.<br />
Metoda musi byG zapisana w tym samym katalogu, co konstruktor czyli @czlowiek.<br />
function emeryt(czlowiek)<br />
p = czlowiek.plec;<br />
w = czlowiek.wiek;<br />
if p==’m’<br />
if w>=65<br />
display(‘EMERYT’)<br />
else<br />
display(‘NIE EMERYT’)<br />
else<br />
if w>=60<br />
display(‘EMERYT’)<br />
else<br />
display(‘NIE EMERYT’)<br />
end<br />
>> Anna = cz>owiek({‘Anna’,’k’,54}); % utworzenie obiektu<br />
>> emeryt(Anna) % wywo>ania funkcji emeryt<br />
Temat 68<br />
Przeci-Oanie funkcji i operatorów<br />
Warunkiem przeci>$enia operatora lub funkcji jest dostp do folderów klas, dla których je<br />
definiujemy. Ka$dy operator obs!ugiwany jest przez odpowiedni> funkcj. Np. dodawanie +<br />
wykonywane jest przez funkcj plus. Przeci>$enie operatora polega na zdefiniowaniu jak<br />
dany operator ma dzia!aG dla obiektów, które zdefiniowali7my.<br />
Przyk!ad:<br />
function w=gt(a,b)<br />
% przeci/Lenie operatora gt(a,b) odpowiednik a>b<br />
% porównuje wiek 2 obiektów klasy ‘czlowiek’<br />
p = a.wiek - b.wiek;<br />
if p >= 0<br />
w = 1;<br />
else<br />
w = 0;<br />
end;<br />
30
Temat 69<br />
Dziedziczenie klas obiektów<br />
W programowaniu obiektowym mo$na tworzyG hierarchi klas. Na podstawie jednych klas<br />
tworzyG nowe klasy o np. bardziej zaw$onym charakterze.<br />
Przyk!ad:<br />
function s=student(dane)<br />
% klasa ‘student’ jest potomkiem klasy ‘czlowiek’<br />
if nargin==0 % brak parametrów wywo>ania<br />
c=cz>owiek;<br />
o.ocena = [ ];<br />
s = class(o,’student’,c); % utworzenie pustego obiektu ‘student’<br />
elseif isa(dane,’student’) % sprawdzenie czy zmienna dana naleLy do klasy ‘student’<br />
s = dane; % dane wej-ciowe s/ obiektem typu ‘student’<br />
else<br />
c = czlowiek({dane(1), dane(2), dane(3)});<br />
o.ocena = dane(4);<br />
s = class(o,’student’,c); % tworzony obiekt ‘student’ z polami wype>nionymi danymi ‘dane’<br />
end<br />
31
OBLICZENIA SYMBOLICZNE W <strong>MATLAB</strong>IE<br />
Temat 70<br />
Definiowanie danych symbolicznych – funkcja sym.<br />
Do definiowania zmiennych lub sta!ych symbolicznych s!u$> funkcje sym i syms.<br />
Przyk!ady:<br />
>> x = sym(‘x’); % definicja zmiennej x<br />
>> a = sym(‘5’); % definicja sta>ej a=5<br />
>> rho = sym('(1+sqrt(5))/2'); % definicja zmiennej symbolicznej okre-laj/cej z>oty -rodek<br />
>> syms y z % definicja dwu zmiennych y, z<br />
Uwaga: Wszystkie zmienne, wykorzystywane w obliczeniach symbolicznych musz> byG<br />
wcze7niej zdefiniowane.<br />
Temat 71<br />
Symboliczne rozwi-zywanie równa% i uk!adów równa% – funkcja solve<br />
Symboliczne rozwi>zywanie równa: mo$liwe jest dziki wykorzystaniu funkcji solve(). Dla<br />
przyk!adu rozwi>zania równania kwadratowego szukamy w nastpuj>cy sposób:<br />
>> x = sym(‘x’); % zdefiniowanie zmiennej symbolicznej<br />
>> y = solve(‘a*x^2+b*x+c=0’); % x jest domy-ln/ zmienn/<br />
Funkcj solve mo$na równie$ wywo!ywaG w inny sposób:<br />
>> y = solve(‘a*x^2+b*x+c’,x); % równowaLne poprzedniemu wywo>aniu, podana zmienna x<br />
>> y = solve(‘a*x^2+b*x+c’); % domy-lnie przyj4te, Le lewa strona równania równa si4 0<br />
Podobnie postpujemy przy uk!adach równa: gdzie kolejne równania wpisujemy rozdzielone<br />
przecinkami.<br />
Przyk!ad:<br />
>> syms x y % zdefiniowanie 2 zmiennych symbolicznych<br />
>> [x,y] = solve(‘x^2+y^2=1’,’x+2*y=2’); % rozwi/zanie. Wynik w postaci 2 wektorów<br />
>> s = solve(‘x^2+y^2=1’,’x+2*y=2’); % rozwi/zanie. Wynik w postaci struktury z 2 wektorami<br />
Temat 72<br />
Upraszczanie wyraOe% symbolicznych – funkcja simplify()<br />
Czsto wynik operacji symbolicznych jest trudny do interpretacji. Uproszczenie wyniku<br />
uzyskujemy dziki zastosowaniu funkcji simplify.<br />
Przyk!ad:<br />
>> simplify(exp(x)*exp(y)) % =exp(x+y)<br />
32
Temat 73<br />
Zmiana postaci wyraOenia symbolicznego<br />
W zale$no7ci od zastosowa: wiele wyra$e: matematycznych mo$na przedstawiG w ró$nych<br />
formach. Matlab oferuje kilka funkcji, których zadaniem jest takie przedstawienie wyniku,<br />
aby spe!nia!o nasze kryteria:<br />
collect<br />
expand<br />
horner<br />
factor<br />
postaG wielomianowa, grupowanie zmiennych<br />
rozwija mno$enia i sumowania<br />
postaG zag!bionych iloczynów<br />
wielomiany w postaci iloczynowej<br />
Temat 74<br />
Inne moOliwe przedstawienia wyniku – funkcja simple()<br />
W przypadku, gdy nie mo$emy si zdecydowaG, które przedstawienie jest najodpowiedniejsze<br />
do naszych celów wygodnym mo$e byG wykorzystanie funkcji simple(), która dane wyra$enie<br />
matematyczne wypisuje we wszystkich mo$liwych formach.<br />
Temat 75<br />
Warto)ci liczbowe w obliczeniach symbolicznych – funkcja subs()<br />
Gdy znamy warto7ci liczbowe poszczególnych zmiennych wynik liczbowy oblicze:<br />
symbolicznych uzyskujemy dziki funkcji subs.<br />
Przyk!ad:<br />
>> syms a b c x % definicja 4 zmiennych symbolicznych<br />
>> y = solve(a*x^2+b*x+c); % rozwi/zanie równania wzgl4dem zmiennej x<br />
>> a=3; b=2; c=1; % Przypisanie warto-ci liczbowych<br />
>> w = subs(y) % Warto-: liczbowa y<br />
Uwaga: Je7li wynik oblicze: jest ju$ liczb> ale przedstawion> w ma!o zrozumia!ej formie w<br />
celu uzyskania jej warto7ci liczbowej wystarczy napisaG: double(x).<br />
Funkcja subs() wykorzystywana jest te$ do zamiany jednego wyra$enia na inne.<br />
Przyk!ad:<br />
>> syms a b x % definicja 3 zmiennych symbolicznych<br />
>> subs(a+b,{a,b},{sin(x),exp(x)}) % = sin(x)+exp(x)<br />
Temat 76<br />
Zmiana wygl-du wy)wietlanych wyników – funkcja pretty()<br />
Wyniki uzyskiwane w Matlabie, nawet po uproszczeniach dziki ró$nym funkcjom czsto s><br />
trudne w odbiorze. Aby wy7wietliG bardziej skomplikowane wyra$enia w formie zbli$onej do<br />
tej jak zapisuje to cz!owiek Matlab oferuje funkcj pretty.<br />
Przyk!ad:<br />
>> a = sym('sin(x)/(2*cos(y))'); % definicja wyraLenia symbolicznego<br />
>> pretty(a) % wy-wietlenie w przyjaznej formie<br />
UWAGA: Funkcja ta ma swoje zastosowanie zarówno do wyra$e: jak i do macierzy.<br />
33
Temat 77<br />
RóOniczkowanie symboliczne – funkcja diff<br />
Do ró$niczkowania symbolicznego wykorzystujemy funkcj diff(funkcja, rz>d), przy, czym<br />
rz>d pochodnej domy7lnie równa si 1.<br />
Przyk!ad:<br />
>> syms x n % definicja 2 zmiennych symbolicznych<br />
>> diff(x^n) % róLniczkowanie symboliczne<br />
Temat 78<br />
Pochodne cz-stkowe.<br />
W przypadku funkcji wielu zmiennych mo$liwe jest liczenie pochodnych cz>stkowych. W<br />
tym celu tak$e korzystamy z funkcji diff() z wywo!aniem: diff(funkcja, zmienna)<br />
Przyk!ad:<br />
>> syms s t % definicja 2 zmiennych symbolicznych<br />
>> f = sin(s*t); % definicja funkcji 2 zmiennych<br />
>> diff(f,t) % pochodna funkcji po zmiennej t<br />
Temat 79<br />
Ca!kowanie symboliczne – funkcja int()<br />
W Matlabie mo$na ca!kowaG zarówno ca!ki oznaczone jak i nieoznaczone. W przypadku<br />
ca!ki nieoznaczonej stosujemy wywo!anie funkcji w postaci: int(funkcja)<br />
W przypadku ca!ki oznaczonej wywo!anie ma nastpuj>c> postaG: int(funkcja, dolne<br />
ograniczenie, górne ograniczenie).<br />
Przyk!ad:<br />
>> int(‘x’); % ca>ko nieoznaczona<br />
>> int(‘sqrt(tan(x))’,0,1); % ca>ka oznaczona<br />
34
Temat 80<br />
Symboliczne rozwi-zywanie równa% róOniczkowych – funkcja dsolve()<br />
Równania ró$niczkowe dowolnego rzdu rozwi>zujemy przy wykorzystaniu funkcji dsolve,<br />
której u$ycie jest podobne do u$ycia funkcji solve. Szczególne znaczenie w symbolicznym<br />
rozwi>zywaniu równa: ró$niczkowych ma zmienna D (du$e D), która okre7la ró$niczk<br />
pierwszego stopnia, i podobnie D2 to ró$niczka stopnia drugiego, itd.<br />
Przyk!ad:<br />
>> dsolve('Dy = a*x'); % róLniczka pierwszego stopnia<br />
W przypadku uk!adu równa:, kolejne równania oddzielamy przecinkami. Podobnie warunki<br />
brzegowe, podajemy po wszystkich równaniach, tak$e oddzielone przecinkami:<br />
dsolve(równanie 1, równanie 2, …, warunek 1, warunek 2, …)<br />
Przyk!ad:<br />
>> dsolve('D2y = -a^2*y', 'y(0) = 1', 'Dy(pi/a) = 0'); % róLniczka stopnia drugiego z warunkami<br />
brzegowymi<br />
Temat 81<br />
Inne funkcje Matlaba wykorzystywane do oblicze% symbolicznych<br />
limit<br />
taylor<br />
jacobian<br />
symsum<br />
granica<br />
szeregiTtaylora<br />
macierz Jacobiego<br />
sumowanie szeregów<br />
Temat 82<br />
Symboliczne odpowiedniki funkcji Matlaba<br />
Cz7G funkcji Matlaba wykorzystywana w obliczeniach numerycznych ma swe odpowiedniki<br />
symboliczne. Do najwa$niejszych nale$>:<br />
diag<br />
inv<br />
det<br />
eig<br />
expm<br />
macierz diagonalna<br />
macierz odwrotna<br />
wyznacznik macierzy<br />
warto7ci w!asne<br />
potgowanie macierzy<br />
Temat 83<br />
Obliczenia o zmiennej precyzji – funkcja vpa<br />
W przypadku gdy interesuje nas warto7G liczbowa z dok!adno7ci> wiksz> ni$ oferuje<br />
zmienna double mo$emy podaG ile cyfr znacz>cych danej zmiennej ma byG wy7wietlanych:<br />
vpa(zmienna, ilo7G cyfr);<br />
Przyk!ad:<br />
>> vpa(pi,50) % wypisuje 50 cyfr znacz/cych liczby pi<br />
35
WSPÓLPRACA <strong>MATLAB</strong>A Z INNYMI<br />
YRODOWISKAMI PROGRAMISTYCZNYMI<br />
Temat 84<br />
Kompilator<br />
Zadaniem kompilatora Matlaba jest zamiana funkcji zapisanej w pliku typu M-file na wersj<br />
wykonywaln>, bibliotek MEX plik lub kod programu w C czy C++.<br />
Kompilator generuje kilka rodzajów plików:<br />
- kod w jzyku C do budowania plików typu MEX<br />
- kod w jzyku C lub C++<br />
- wykonywaln> aplikacj><br />
- biblioteki dynamiczne i statyczne<br />
Dziki wykorzystaniu kompilatora uzyskujemy przyspieszenie pracy aplikacji, ukrycie kodu<br />
przed innymi u$ytkownikami oraz mo$liwo7G budowy niezale$nych aplikacji.<br />
Temat 85<br />
Wywo!anie kompilatora – funkcja mcc<br />
Sk!adnia wywo!ania funkcji:<br />
mcc [-opcja] funkcja [funkcja2 …] [mex1 … mexN] [mlib1 … mlibN]<br />
Gdzie:<br />
W nawiasach kwadratowych umieszczone parametry opcjonalne,<br />
opcja – litery oznaczaj>ce ró$ne opcje kompilatora<br />
funkcja – nazwa funkcji poddawana kompilacji,<br />
max – nazwa pliku typu MEX<br />
mlib – nazwa biblioteki<br />
Najwa$niejsze opcje:<br />
-c Generuje kod C<br />
-p Generuje kod C++ oraz dzia!aj>c> aplikacj<br />
-x Generuje plik typu MEX<br />
-t Generuje kod w C lub w C++<br />
-T W zale$no7ci od opcji generuje ró$ne pliki:<br />
codegen<br />
compile:mex<br />
compile:exe<br />
compile:lib<br />
link:mex<br />
link:exe<br />
link:lib<br />
Przyk!ad:<br />
>> mcc –x funkcja % generuje plik typu MEX na podstawie pliku funkcja.m<br />
>> mcc –m funkcja % generuje wykonywaln/ aplikacj4 na podstawie pliku funkcja.m<br />
>> mcc –p funkcja % generuje kod w C++ i wykonywaln/ aplikacj4<br />
>> mcc –t –L C % generuje kod w C na podstawie pliku funkcja.m<br />
>> mcc –t –L Cpp % generuje kod w C++ na podstawie pliku funkcja.m<br />
>> mcc –m funkcja1 funkcja2 % generuje wykonywalne aplikacje na podstawie plików<br />
funkcja1.m oraz funkcja2.m<br />
>> mcc –T compile:exe funkcja % generuje wykonywaln/ aplikacj4<br />
>> mcc –t W lib:a –T link:lib a0 a1 % generuje bibliotek4 dynamiczn/ „a” na podstawie plików<br />
a0.m oraz a1.m<br />
36
Temat 86<br />
Ograniczenia uOycia funkcji kompilatora<br />
Kompilator pracuje tylko na funkcjach zapisanych w plikach typu M. Nie kompiluje<br />
skryptów.<br />
Kompilacji nie podlegaj> funkcje wykorzystuj>ce obiekty.<br />
Kompilacji nie podlegaj> funkcje korzystaj>ce z polece: input, eval je7li te dzia!aj> na<br />
zmiennych z workspace oraz operuj>ce na zmiennych globalnych.<br />
Uwaga: Kompilacji nie podlegaj> funkcje matlabowe, które nie maj> swojego pliku typu M.<br />
Temat 87<br />
Wspó!prace Matlaba z Excelem<br />
Do wczytania danych z programu Microsoft Excel wygodnie jest wykorzystaG okno importu<br />
danych dostpne z menu Matlaba.<br />
Do zapisania zmiennych z Matlaba w formie !atwej do otworzenia w Excelu nale$y<br />
skorzystaG z funkcji xlswrite.<br />
Przyk!ad:<br />
>> x=rand(5); % generacja przyk>adowej macierzy<br />
>> xlswrite(‘dane’,x) % zapisuje w pliku Excelowym dane.xls zmienn/ x<br />
37