Cíle
Cílem semináře je naučit se vytvářet různé typy funkcí s pevným nebo proměnlivým počtem argumentů, s tím souvisejícími tématy a dále základy práce se soubory a řetězci.
Vytváření pojmenovaných funkcí
Pojmenované funkce lze v matlabu definovat pouze v M-souboru. Definice fukce začíná její hlavičkou, která má následující syntax:
function [y1,...,yN] = myfun(x1,...,xM)
Hlavička funkce tedy začíná klíčovým slovem function
, myfun je pak název funkce.
y1,...,yN
je seznam výstupních parametrů, x1,...,xM
je seznam vstupních parametrů.
Dále následuje tělo funkce, které je ukončeno klíčovým slovem end
.
M-soubory mohou obsahovat více funkcí. Prví funkce v M-souboru se nazývá hlavní. Tato funkce je viditelná pro funkce v jiných M-souborech a lze ji zavolat z příkazového řádku. Ať už hlavní funkci pojmenujeme jakkoliv, pro její název v Matlabu bude použit název souboru, ve kterém je uložená. Pokud M-soubor tedy definuje funkci (tedy nejedná se o skript), je vhodné jej pojmenovat stejně jako hlavní funkci, která je v něm uložená.
Další funkce v souboru se nazývají lokální funkce a mohou se vyskytovat v jakémkoli pořadí po hlavní funkci. Lokální funkce jsou viditelné pouze v daném M-souboru.
Pokud uložíme funkci do složky s názvem private, její viditelnost bude omezená pouze pro skripty a funkce ve složce o úroveň výš. Těmto funkcím se říká soukromé.
Více informací o funkcích obecně naleznete zde.
Příklad:
function [m,s] = stat2(x)
n = length(x);
m = avg(x,n);
s = sqrt(sum((x-m).^2/n));
end
function m = avg(x,n)
m = sum(x)/n;
end
Všimněte si, že M-soubory obsahující funkci mají v prohlížeči souborů v Matlabu jinou ikonu než skripty.
V Matlabu lze definovat funkce také v těle jiné funkce. Těmto funkcím se říká vnořené. Více o vnořených funkcích je zde.
Anonymní funkce
V Matlabu lze kromě pojmenovaných funkcí vytvářet i funkce anonymní.
Tyto funkce jsou uloženy v proměnné typu function_handler
.
Anonymní funkce lze narozdíl od pojmenovaných funkcí vytvořit i v příkazové řádce (Command Window).
Syntaxe:
@(x1,...,xM)statement
Kde x1,...,xM
jsou vstupní parametry.
Příklad:
myAnonymousfunction = @(x,y) (x^2 + y^2 + x*y);
x = 1;
y = 10;
z = myAnonymousfunction(x,y)
Ukazatele na funkce
Symbol @
slouží také k získání ukazatele na funkci.
Můžeme pak tedy předávat ukazatel na funkci jako hodnotu do jiné funkce.
Příklad:
% Compute the value of the integrand at 2*pi/3.
x = 2*pi/3;
y = myIntegrand(x)
% Compute the area under the curve from 0 to pi.
xmin = 0;
xmax = pi;
f = @myIntegrand;
a = integral(f,xmin,xmax)
function y = myIntegrand(x)
y = sin(x).^3;
end
Cell arrays
Zatím jsme v Matlabu setkali s maticemi, jejichž prvky byly všechny stejného typu.
Více rozměrné pole typu cell array
je pole, jehož prvky mohou být dále jakéhokoliv typu.
Mohou se hodit například v situaci, kdy je potřeba sdružit data různých datových typů, která spolu ale souvisí.
Pokud chceme definovat matici nebo pole tohoto typu, použijeme kudrnaté závorky {}
.
V Matlabu je také k dispozici pro práci s cell arrays mnoho funkcí.
Více v dokumentaci zde.
Vstupní a výstupní parametry funkcí: nargin a nargout, varargin a varargout
Nargin
a nargout
slouží ke zjištění počtu vstupní a výstupních parametrů funkce.
Mají dvojí použití.
Nargin
a nargout
počty zadaných proměnných,
které odpovídající aktuálnímu volání funkce.
Můžeme takto zjistit, kolik parametrů, ať už vstupních nebo výstupních uživatel při volání zadal
a podle toho měnit chování funkce.
Následující funkce počítá obsah obdélníku, pokud je volána se dvěma argumenty. Pokud je zavolána jen s jedním, vypočítá obsah čtverce.
function v = volume(a, b)
if nargin == 1
v = a*a;
else
v = a*b;
end
end
Zavoláno s parametrem, kterým je název funkce, pak vrací počet proměnných, které jsou uvedeny v definici v hlavičce funkce.
Tedy pro funkci s názvem function zavoláme nargout(function)
.
Více v dokumentaci zde.
Varargin
a varargout
slouží k definice funkce s libovolným počtem vstupních a nebo výstupních proměnných.
Varargin
i varargout
se uvádí v seznamu parametrů vždy na posledním místě za explicitně pojmenovanými argumenty.
Při zavolání patřičné funkce s n
parametry navíc oproti explicitně pojmenovaným parametrům, bude vektor varargin
velikosti 1xn
typu cell
obsahovat
tyto proměnné. Obdobně pro varargout
.
Práce se soubory
Pro uložení matic (nebo polí) do souboru v patřičném formátu slouží funkce writematrix
.
Pokud ji zavoláme pouze s jedním parametrem, uloží matici do textového souboru (s příponou txt).
Pokud ji zavoláme se dvěma parametry, kde prvním je daná proměná a druhý je název výstupního souboru,
uloží funkce proměnnou ve formátu, který je určen příponou v názvu výstupního souboru.
Seznam podporovaných formátů je zde.
Proměnnou můžeme zpět načíst pomocí funkce readmatrix
.
Se soubory lze v Matlabu pracovat také nízkoúrovňově.
Soubor lze otevřít pomocí funkce fopen
.
Otevřený soubor zavřeme funkcí fclose
.
Pro práci se souborem pak můžeme použít funkce fget, fgets, fread, fwrite, fcanf a další.
Následující kód zapíše do souboru myFile.txt vždy na samostatný řádek dvojici číslo a jeho mocninu:
fid = fopen( 'myFile.txt', 'wt' );
for i = 1:10
fprintf(fid, '%f %f\n', i, i*i);
end
fclose(fid);
Řetězce
Matlab nabízí mnoho různých funkcí pro práci s řetězci. Seznam nejpoužívanějších funkcí naleznete zde.