m-funkcje
m-funkcje
Oprócz funkcji anonimowych użytkownik może definiować bardziej skomplikowane funkcje zajmujące wiele linijek. Funkcje te umieszcza się w osobnych plikach z rozszerzeniem *.m (podobnie jak skrypty), przy czym nazwa pliku musi powinna być taka sama jak nazwa funkcji. Dla rozróżnienia od funkcji anonimowych, będziemy nazywać je m-funkcjami. Ponieważ zarówno skrypty jak i m-funkcje mają to samo rozszerzenie, warto nazywać pliki z funkcjami od litery „f”, np.: fLiczbyFibonacciego, czy też fSortuj.
Składnia m-funkcji wygląda następująco:
function [y1,y2,y3,...] = nazwaFunkcji(x1,x2,x3,...)
%% tutaj wypada umieścić krótki opis funkcji
% a pod spodem bardziej szczegółowy opis funkcji
[tu są instrukcje]
end % koniec ciała funkcji
xi są argumentami wejściowymi funkcji, zaś yi – argumentami wyjściowymi.
Zadanie (1)
Utwórz m-plik o odpowiedniej nazwie w katalogu roboczym MATLABa i umieść w nim następującą m-funkcję:
function [y1,y2] = fLucas(n)
% obliczanie liczb Lucasa
% oblicza n-tą lub n-tą i n+1 liczbę Lucasa
% w zależności od argumentów wyjściowych
if nargin<1
error('Za mało argumentów wejsciowych!');
end
if nargout<=1
disp(['Oblicze ' num2str(n) '-ta liczbe Lucasa.']);
else
disp(['Oblicze ' num2str(n) '. i ' num2str(n+1) '. liczbe Lucasa.']);
end
y1=2; y2=1;
if n==1
y1=2; y2=1;
elseif n==2
y1=1; y2=3;
end
if n>2
for k=2:n
temp=y1+y2;
y1=y2;
y2=temp;
end
end
end % kończy ciało funkcji
Następnie wpisz w oknie poleceń:
>> help fLucas
>> a = fLucas(5)
>> [a,b] = fLucas(5)
>> [a,b,c] = fLucas(5)
>> fLucas(5)
Polecenie nargin zwraca liczbę argumentów wejściowych, zaś nargout – argumentów wyjściowych. W pliku z funkcją zmień linijkę nargout<=1 na nargout==1 i ponownie wywołaj ostatnie polecenie.
Oprócz m-funkcji mamy też podfunkcje, czyli funkcje zdefiniowane wewnątrz pliku zawierającego już definicję m-funkcji i wykorzystywane wewnątrz ciała funkcji pierwotnej. O ile m-funkcje są dostępne spoza pliku, to do podfunkcji dostęp jest jedynie z wnętrza pliku, w którym została ona zdefiniowana.
Zadanie (2)
Utwórz m-plik o nazwie fNewton.m w katalogu roboczym MATLABa i umieść w nim następujące m-funkcje:
function newt = fNewton(n,k)
% funkcja obliczajaca "n po k"
newt = fSilnia(n) / (fSilnia(n-k)*fSilnia(k));
end
function silnia = fSilnia(n)
% podfunkcja liczaca silnie
silnia=1;
for k=2:n
silnia = silnia*k;
end
end
Przetestuj, które z tych poleceń dadzą się wykonać:
>> help fNewton
>> help fSilnia
>> fNewton(3,2)
>> fNewton(2,3)
>> fSilnia(5)
Zadanie (3)
m-funkcje mogą być funkcjami rekurencyjnymi. Utwórz m-plik o nazwie fNWD.m i wpisz w nim:
function nwd = fNWD(a,b)
% funkcja liczy najwiekszy wspolny dzielnik dwoch liczb
% korzystajac z algorytmu Euklidesa
if a==b
nwd = a;
elseif a>b
nwd = fNWD(a-b,b);
elseif a<b
nwd = fNWD(a,b-a);
end
end
Przetestuj działanie powyższej funkcji wywołując odpowiednie polecenia w oknie poleceń.
Zadanie (4)
Nie każda m-funkcja musi zwracać wynik – możemy napisać taką m-funkcję, która tylko coś robi. Utwórz m-plik o odpowiedniej nazwie zawierający poniższą funkcję:
function fHello(x)
disp(['Hello, przeslales ' num2str(x)]);
disp('Nacisnij cos!');
pause; % po poleceniu pause MATLAB zaczeka aż coś naciśniemy
disp('Papa :)') ;
end
Przetestuj funkcję fHello w oknie poleceń:
>> fHello(3)
>> a = fHello(3)