Seminář 3 KMI/PVM Programování v MATLABu

Mírně pokročilé programování v MATLABu

Funkce

function [output arguments] = function_name(input arguments)
% Comment describing the function (lookfor)
% other comments (help)
Statements here;
% normal comments
end

Jméno funkce (vyjma podfunkcí) musí být shodné s názvem M souboru. Počet parametrů funkce je dán proměnou nargin a nargout. Samotné parametry jsou dostupné přes jejich název (formální parametry) nebo přes proměnnou varargin a varargout. Funkce se stejným názvem jako M file se nazývá primární. Ostatní funkce se nazývají podfunkce. Ty jsou dostupné pouze z primární funkce. Funkce lze vnořovat (přístup k proměnný nadřazené funkce).

Speciální formy funkcí

Práce s řetezci

Přehled nejběžnějších funkcí pro práci z řetězci

>> names = ['Tony Stark'; 'Steve Rogers']
??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

>> names = strvcat('Tony Stark', 'Steve Rogers')

names =
  Tony Stark
  Steve Rogers

>> names = char('Tony Stark', 'Steve Rogers')

names =
  Tony Stark
  Steve Rogers

>> [names, [' '; ' '] names]

ans =
  Tony Stark   Tony Stark
  Steve Rogers Steve Rogers

Cell arrays

>> A = {[1,2;3,4]}

A =
    [2x2 double]

>> A{1}(2,2)

ans =
      4

A = {[1, 2; 3, 4], 'text'}

A =
    [2x2 double]    'text'

>> A = cell(2,3)

A =
    []    []    []
    []    []    []
  

Pro vypsaní pole buňek, lze použít funkce celldisp nebo cellplot

Práce se soubory

>> A = rand(10);
% pomale, ale jednoduche
>> dlmwrite('file', A);
>> dlmread('file');

>> save A '-ascii';
% nizkourovnovy pristup
fid = fopen('file');
% zde muzeme pouzit cokoliv
% fget, fgets, fread, fwrite, fcanf a dalsi
% vice help fopen
fclose(fid);

Doporučená literatura na dnešní seminář

Úkoly

  1. Napište funkci rle_code které zkomprimuje zadaný řetězec pomocí RLE komprese, kde je výskyt znaku (znakem se rozumí cokoliv kromě číslic) kódován číslem reprezentující počet opakování a znakem samotným.

    >> rle_code('AAABBCDDDD')
    ans =
    
      3A2B1C4D

  2. Upravte předchozí funkci rle_code tak, aby rozpoznávala zda je jí předán již zakódovaný řetězec (začíná číslem). Pokud ano, funkce řetězec dekóduje.

  3. Napište funkci alocation(n), které vygeneruje n matic A (tedy matice A1, A2, A3, ...). Rozměr matice A1 je n x n, matice A2 (n-1) x (n-1)) a tak dále. Nápověda využijte funkci cell.

  4. Napište funkci dat2bin(file, typ), které převede soubor file uložený v dat formátu do binární reprezentace (typ Double pokud je typ nastaven na 'd', typ Logical pokud je typ nastaven na 'l'.) Dat formát má následující strukturu. Každý řádek odpovídá řádku binární (Booleovské) matice. Hodnoty na řádku (oddělené mezerami) odpovídají sloupcům binární matice. Pokud je hodnota uvedena, znamená to, že zadaný řádek má v uvedeném sloupci hodnotu 1. Například:

    % soubor
    1 2 5
    3 4
    
    5
    3 4
    
    % odpovidajici matice
    1 1 0 0 1
    0 0 1 1 0
    0 0 0 0 0
    0 0 0 0 1
    0 0 1 1 0
    Pro testování použijte tento dataset. Který obsahuje 185294 jedniček, 3485 řádků a 10127 sloupců.

© Martin Trnečka