Funkce a mírně pokročilé programování

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í.

Uvnitř funkce se 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.