MATLAB - Funkcje
Funkcja to grupa instrukcji, które razem wykonują zadanie. W MATLAB-ie funkcje są zdefiniowane w oddzielnych plikach. Nazwa pliku i funkcji powinny być takie same.
Funkcje działają na zmiennych w ich własnym obszarze roboczym, który jest również nazywany local workspace, niezależnie od obszaru roboczego, do którego uzyskujesz dostęp z wiersza poleceń MATLAB, który jest nazywany base workspace.
Funkcje mogą akceptować więcej niż jeden argument wejściowy i mogą zwracać więcej niż jeden argument wyjściowy.
Składnia instrukcji funkcji to -
function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)
Przykład
Następującą funkcję o nazwie mymax należy zapisać w pliku o nazwie mymax.m . Przyjmuje pięć liczb jako argument i zwraca ich maksimum.
Utwórz plik funkcji o nazwie mymax.m i wpisz w nim następujący kod -
function max = mymax(n1, n2, n3, n4, n5)
%This function calculates the maximum of the
% five numbers given as input
max = n1;
if(n2 > max)
max = n2;
end
if(n3 > max)
max = n3;
end
if(n4 > max)
max = n4;
end
if(n5 > max)
max = n5;
end
Pierwsza linia funkcji zaczyna się od słowa kluczowego function. Podaje nazwę funkcji i kolejność argumentów. W naszym przykładzie funkcja mymax ma pięć argumentów wejściowych i jeden argument wyjściowy.
Wiersze komentarza, które znajdują się zaraz po instrukcji funkcji, zawierają tekst pomocy. Te wiersze są drukowane podczas wpisywania -
help mymax
MATLAB wykona powyższą instrukcję i zwróci następujący wynik -
This function calculates the maximum of the
five numbers given as input
Możesz wywołać funkcję jako -
mymax(34, 78, 89, 23, 11)
MATLAB wykona powyższą instrukcję i zwróci następujący wynik -
ans = 89
Funkcje anonimowe
Funkcja anonimowa jest podobna do funkcji wbudowanej w tradycyjnych językach programowania, zdefiniowanej w pojedynczej instrukcji MATLAB. Składa się z pojedynczego wyrażenia MATLAB oraz dowolnej liczby argumentów wejściowych i wyjściowych.
Możesz zdefiniować anonimową funkcję bezpośrednio w wierszu poleceń MATLAB lub w funkcji lub skrypcie.
W ten sposób możesz tworzyć proste funkcje bez konieczności tworzenia dla nich pliku.
Składnia tworzenia anonimowej funkcji na podstawie wyrażenia to
f = @(arglist)expression
Przykład
W tym przykładzie napiszemy anonimową funkcję o nazwie power, która przyjmie dwie liczby jako dane wejściowe i zwróci pierwszą liczbę podniesioną do potęgi drugiej liczby.
Utwórz plik skryptu i wpisz w nim następujący kod -
power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)
Po uruchomieniu pliku wyświetla się -
result1 = 343
result2 = 7
result3 = 1.0000e-10
result4 = 9.5459
Funkcje podstawowe i podrzędne
Każda funkcja inna niż funkcja anonimowa musi być zdefiniowana w pliku. Każdy plik funkcji zawiera wymaganą funkcję podstawową, która pojawia się jako pierwsza, oraz dowolną liczbę opcjonalnych funkcji podrzędnych, które występują po funkcji podstawowej i są przez nią używane.
Funkcje podstawowe mogą być wywoływane spoza pliku, który je definiuje, z wiersza poleceń lub z innych funkcji, ale funkcje podrzędne nie mogą być wywoływane z wiersza poleceń lub innych funkcji, poza plikiem funkcji.
Funkcje podrzędne są widoczne tylko dla funkcji podstawowej i innych funkcji podrzędnych w pliku funkcji, który je definiuje.
Przykład
Napiszmy funkcję o nazwie kwadratowa, która obliczyłaby pierwiastki równania kwadratowego. Funkcja wymagałaby trzech wejść, współczynnika kwadratowego, współczynnika liniowego i stałego członu. Przywróciłoby korzenie.
Plik funkcji quadratic.m będzie zawierał podstawową funkcję quadratic i dysk podfunkcji , który oblicza dyskryminację.
Utwórz plik funkcji quadratic.m i wpisz w nim następujący kod -
function [x1,x2] = quadratic(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
Możesz wywołać powyższą funkcję z wiersza polecenia jako -
quadratic(2,4,-4)
MATLAB wykona powyższą instrukcję i zwróci następujący wynik -
ans = 0.7321
Funkcje zagnieżdżone
Możesz zdefiniować funkcje w treści innej funkcji. Nazywa się to funkcjami zagnieżdżonymi. Zagnieżdżona funkcja zawiera dowolny lub wszystkie składniki dowolnej innej funkcji.
Zagnieżdżone funkcje są zdefiniowane w zakresie innej funkcji i współużytkują dostęp do obszaru roboczego funkcji zawierającej.
Zagnieżdżona funkcja ma następującą składnię -
function x = A(p1, p2)
...
B(p2)
function y = B(p3)
...
end
...
end
Przykład
Przepiszmy funkcję kwadratową , z poprzedniego przykładu, jednak tym razem funkcja dysku będzie funkcją zagnieżdżoną.
Utwórz plik funkcji quadratic2.m i wpisz w nim następujący kod -
function [x1,x2] = quadratic2(a,b,c)
function disc % nested function
d = sqrt(b^2 - 4*a*c);
end % end of function disc
disc;
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of function quadratic2
Możesz wywołać powyższą funkcję z wiersza polecenia jako -
quadratic2(2,4,-4)
MATLAB wykona powyższą instrukcję i zwróci następujący wynik -
ans = 0.73205
Funkcje prywatne
Funkcja prywatna to funkcja podstawowa, która jest widoczna tylko dla ograniczonej grupy innych funkcji. Jeśli nie chcesz ujawniać implementacji funkcji, możesz utworzyć je jako funkcje prywatne.
Funkcje prywatne znajdują się w subfolders ze specjalną nazwą private.
Są widoczne tylko dla funkcji w folderze nadrzędnym.
Przykład
Pozwól nam przepisać kwadratową funkcję. Tym razem jednak funkcja dysku obliczająca dyskryminację będzie funkcją prywatną.
Utwórz podfolder o nazwie private w katalogu roboczym. Zapisz w nim następujący plik funkcji disc.m -
function dis = disc(a,b,c)
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end % end of sub-function
Utwórz funkcję quadratic3.m w katalogu roboczym i wpisz w niej następujący kod -
function [x1,x2] = quadratic3(a,b,c)
%this function returns the roots of
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficient of x2, x and the
%constant term
% It returns the roots
d = disc(a,b,c);
x1 = (-b + d) / (2*a);
x2 = (-b - d) / (2*a);
end % end of quadratic3
Możesz wywołać powyższą funkcję z wiersza polecenia jako -
quadratic3(2,4,-4)
MATLAB wykona powyższą instrukcję i zwróci następujący wynik -
ans = 0.73205
Zmienne globalne
Zmienne globalne mogą być współużytkowane przez więcej niż jedną funkcję. W tym celu musisz zadeklarować zmienną jako globalną we wszystkich funkcjach.
Jeśli chcesz uzyskać dostęp do tej zmiennej z podstawowego obszaru roboczego, zadeklaruj zmienną w wierszu poleceń.
Deklaracja globalna musi wystąpić, zanim zmienna zostanie faktycznie użyta w funkcji. Dobrą praktyką jest używanie wielkich liter w nazwach zmiennych globalnych, aby odróżnić je od innych zmiennych.
Przykład
Utwórzmy plik funkcji o nazwie Average.m i wpisz w nim następujący kod -
function avg = average(nums)
global TOTAL
avg = sum(nums)/TOTAL;
end
Utwórz plik skryptu i wpisz w nim następujący kod -
global TOTAL;
TOTAL = 10;
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];
av = average(n)
Po uruchomieniu pliku wyświetli się następujący wynik -
av = 35.500