155GIT1 / 7. cvičení: Porovnání verzí
mBez shrnutí editace |
mBez shrnutí editace |
||
Řádek 3: | Řádek 3: | ||
== Náplň == | == Náplň == | ||
# uživatelské funkce | |||
# chybová hlášení, nápověda k funkci | |||
# drobné smíšené úlohy | |||
== Ukázky == | == 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 komplexni 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 == |
Verze z 9. 2. 2022, 21:56
Uživatelské funkce
Náplň
- uživatelské funkce
- chybová hlášení, nápověda k funkci
- 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 .m. Název souboru musí odpovídat názvu funkce! Klíčové slovo function musí být na prvním řádku souboru.
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
Příklad volání
data = rand(5)
[mi, ma, mn] = stat(data);
fprintf('min = %.3f\nmax = %.3f\nmean = %.3f\n', mi, ma, mn)
Chybová hlášení, nápověda
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 komplexni cisla.')
end
min_x = min(min(x));
max_x = max(max(x));
mean_x = mean(x(:));
end
Vyvolání nápovědy k uživatelské funkci:
help stat
Volání funkce (chybná vstupní data):
data1 = [data, 5+2i * ones(5,1)]
[mi, ma, mn] = stat(data1)
Příkaz return
- je-li v běhu funkce vykonán příkaz return, 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 Taylorova řada:
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
Funkce pro načtení neformátovaných dat po řádcích
např. záměna čárky za tečku:
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);
datový soubor carky.txt ke stažení
Volání funkce:
teckazacarku('carky.txt')