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)

 

 

Ostatnia modyfikacja: poniedziałek, 2.09.2013, 16:00 PM