|
|
(Není zobrazeno 5 mezilehlých verzí od 2 dalších uživatelů.) |
Řádek 1: |
Řádek 1: |
| {{Geoinformatika}} | | {{Geoinformatika}} |
| {{Cvičení|155GIT1|5|Uživatelské funkce}} | | {{Cvičení|155GIT1|5|1. test}} |
|
| |
|
| == Náplň cvičení == | | == Náplň == |
|
| |
|
| # uživatelské funkce
| | ; Zadání testu |
| # chybová hlášení, nápověda k funkci
| | * https://moodle-vyuka.cvut.cz/course/view.php?id=10915 |
| # drobné smíšené úlohy
| | <!-- |
|
| |
|
| == Ukázky ==
| |
|
| |
|
| === Uživatelské funkce ===
| |
|
| |
|
| '''Syntax'''
| |
|
| |
| function [vystup1,vystup2,...,vystupn] = nazev(vstup1,vstup2,...,vstupn)
| |
|
| |
| end % end neni povinne
| |
|
| |
| Každá funkce musí být uložena ve vlastním souboru s příponou <tt>.m</tt>. Název souboru musí odpovídat názvu funkce! Klíčové slovo <tt>function</tt> musí být na prvním řádku souboru.
| |
|
| |
| <source lang=octave>
| |
| function [min_x, max_x, mean_x] = stat(x)
| |
|
| |
| min_x = min(min(x));
| |
| max_x = max(max(x));
| |
| mean_x = mean(x(:)); % stejny vysledek jako mean_x = mean(mean(x))
| |
|
| |
| end
| |
| </source>
| |
|
| |
| '''Příklad volání'''
| |
|
| |
| <source lang=octave>
| |
| data = rand(5)
| |
| [mi, ma, mn] = stat(data);
| |
| fprintf('min = %.3f\nmax = %.3f\nmean = %.3f\n', mi, ma, mn)
| |
| </source>
| |
|
| |
| === Chybová hlášení, nápověda ===
| |
|
| |
| <source lang=octave>
| |
| function [min_x, max_x, mean_x] = stat(x)
| |
| % vypocet minimalni, maximalni a prumerne hodnoty matice
| |
|
| |
| if any(any( imag(x)>0 ))
| |
| error('stat: Vstupni matice obsahuje imaginarni cisla.')
| |
| end
| |
| min_x = min(min(x));
| |
| max_x = max(max(x));
| |
| mean_x = mean(x(:));
| |
|
| |
| end
| |
| </source>
| |
|
| |
| Vyvolání nápovědy k uživatelské funkci:
| |
|
| |
| <source lang=octave>
| |
| help stat
| |
| </source>
| |
|
| |
| Volání funkce (chybná vstupní data):
| |
|
| |
| <source lang=octave>
| |
| data1 = [data, 5+2i * ones(5,1)]
| |
| [mi, ma, mn] = stat(data1)
| |
| </source>
| |
|
| |
| === Příkaz return ===
| |
| * je-li v běhu funkce vykonán příkaz <tt>return</tt>, je okamžitě činnost funkce ukončena (bez vykonání evtl.dalších příkazů) a na pozici jejího volání jsou vráceny aktuálně vypočtené hodnoty výstupních parametrů funkce
| |
|
| |
| === Drobné úlohy ===
| |
|
| |
| '''Funkce pro výpočet nekonečné řady do zadané přesnosti (příklad iterativního výpočtu)'''
| |
|
| |
| např. výpočet funkce arctg(), viz {{wikipedia|Taylorova řada}}:
| |
|
| |
| <source lang=octave>
| |
| function [arctgx] = arctg(x,mez)
| |
| % vypocet funkce arctg rozvojem v radu do zadane presnosti
| |
| % IN: x ... vektor argumentu funkce
| |
| % mez ... zadana presnost vypoctu
| |
| % OUT: arctgx ... vektor vypoctenych uhlu z intervalu <-pi/2,pi/2>
| |
|
| |
| if any(x > 1) | any(x < -1)
| |
| error('arctg: Vstupni hodnoty musi byt z intervalu <-1,1>.')
| |
| end
| |
|
| |
| % vypocet pro kazdy prvek daneho vektoru samostatne
| |
| for i=1:length(x)
| |
| % start iterace pro i-ty vstupni prvek
| |
| y0 = 100; % vkladam fiktivni hodnotu, kterou x na vstupu nikdy nemuze nabyt
| |
| % 1.iterace
| |
| n = 1;
| |
| y = x(i);
| |
| while abs( y-y0 ) > mez
| |
| % n-ta iterace
| |
| n = n+1;
| |
| y0 = y;
| |
| y = y0 + (-1)^(n+1) * x(i)^(2*n-1) / (2*n-1);
| |
| end
| |
| % ulozeni vypoctene hodnoty do vystupni promenne
| |
| arctgx(i) = y;
| |
| fprintf('Pocet iteraci vypoctu: %d\n',n)
| |
| end
| |
| </source>
| |
|
| |
| '''Funkce pro načtení neformátovaných dat po řádcích'''
| |
|
| |
| např. záměna čárky za tečku:
| |
|
| |
| <source lang=octave>
| |
| function teckazacarku(file)
| |
| % vyhleda vsechny carky v souboru a zameni je za tecku
| |
| % IN: file ... jmeno vstupniho souboru (textovy retezec)
| |
|
| |
| if ischar(file) == 0
| |
| error('Jmeno vstupniho souboru musi byt textovy retezec.');
| |
| end
| |
|
| |
| vstup = fopen(file,'r');
| |
|
| |
| filenew = [file(1:end-4), '_upr', file(end-3:end)]; % jmeno noveho souboru
| |
| vystup = fopen(filenew,'w');
| |
|
| |
| konec = 0; % indentifikator konce souboru
| |
| while konec==0
| |
| radek = fgets(vstup); % fgets() nacte 1 radek souboru (se znakem \n)
| |
| for i=1:length(radek)
| |
| if radek(i) == ','
| |
| radek(i) = '.';
| |
| end
| |
| end
| |
| fprintf(vystup,'%s',radek);
| |
| konec = feof(vstup); % feof() vrati pro konec souboru hodnotu 1, jinak vraci hodnotu 0
| |
| end
| |
|
| |
| fclose all;
| |
| fprintf('Data ulozena do souboru %s\n',filenew);
| |
| </source>
| |
|
| |
| datový soubor [http://geo102.fsv.cvut.cz/vyuka/155GIT1/data/carky.txt carky.txt] <!--[ftp://athena.fsv.cvut.cz/ZFG/GIT1/carky.txt carky.txt]--> ke stažení
| |
|
| |
| Volání funkce:
| |
|
| |
| <source lang=octave>
| |
| teckazacarku('carky.txt')
| |
| </source>
| |
|
| |
|
| == Úlohy == | | == Úlohy == |
| * [[155GIT1 / 5. cvičení / Příklady|5. cvičení - příklady]] | | * [[155GIT1 / 5. cvičení / Příklady|5. cvičení - příklady]] |
| | --> |
| | <!-- --> |