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

Úvod do programování v Matlabu

Programy se v MATLABu zapisují do souborů typu M-File (přípona .m).

Užitečné zkratky: CTRL+n vytvoří nový skript, F5 provede aktuální skript, F9 provede vybranou část kódu, CTRL+enter vykoná aktuální buňku kódu. CTRL+r zakomentuje blok kodu, CTRL+t odkomentuje blok kodu, CTRL+i provede automatické odsazení kódu.

Proměnné

Typy proměnných

Více o datových typech v MATLABu naleznete zde.

x = 10;
% veskere promenne se stale chovaji jako matice!
>> size(x)
ans =
     1     1

Navíc speciální typ uložení (sparse) pro některé datové typy. Pozor. Při použití proměnné stejné jako je název již existující (či funkce) dojde k jejímu přepsání (je možné např. modifikovat funkci plus).

Rozsah proměných

Lokální, globální (global) a persistentní (persistent). Poslední jsou analogie lokálních proměnných navíc si uchovávají hodnotu mezi voláními funkce.

Speciální proměnné

ans, inf, NaN, version, computer.

Řetězce

Uvozují se uvozovkami.

Operátory

Základní přehled operátorů. Operátory mají obvykle textový a symbolické název (plus a +). Nerovnost se netradične označuje ~=.

Řízení běhu programu

Konstrukce if, elseif, else

if r == c
  A(r,c) = 2;
elseif abs(r-c) == 1
  A(r,c) = -1;
else
  A(r,c) = 0;
end

Konstrukce switch

n = input('Enter a number: ');

switch n
    case -1
        disp('negative one')
    case 0
        disp('zero')
    case 1
        disp('positive one')
    otherwise
        disp('other value')
end

Cyklus for

% zakladni cyklus
s = 10;
H = zeros(s);

for i = 1:s
    for j = 1:s
        H(r,c) = 1/(i+j-1);
    end
end

% uprava kroku
for v = 1.0:-0.2:0.0
   disp(v)
end

% iterace pres vektor
for v = [1 5 8 17]
   disp(v)
end

% automaticka iterace pres vektory matice
for I = eye(4,3)
    disp('Current unit vector:')
    disp(I)
end

break, continue, pause, keyboard (klavesnicový mód, ukončení příkazem return).

Cyklus while

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

Vstup a výstup

% nacteni cisla
mynumber = input('Enter the number: ');
% nacteni textoveho retezce
mystr = input('Enter a string: ', 's');

% graficky dialog pro vyber
volba = menu('Vyberte', 'a', 'b', 'c');

% vypsani lze provest pomoci funkci disp, display nebo printf
% fprintf lze aplikovat i na matice

Práce s M-soubory

Automaticky se prohledává aktuální adresář. Pokud je soubor umístěn v jiné složce, je třeba přidat tuto cložku do proměnné path (více help path). Upravy souboru lze provést příkazem edit, potlačení výpisu v M-souborech lze provést příkazem echo. Funkce lookfor hledá v komentářích na prvních řádcích.

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

Úkoly

  1. Vytvoře vektor V obsahující čísla 1 až 10. Následně tento vektor převraťte (bude obsahovat čísla 10 až 1) bez použití funkce fliplr

  2. Vytvořte skript který pouze za použití konstrukce for vytvoří následující čtvercové matice, kde velikost matice je určena uživatelem (zadána z klávesnice).

    A =
         0     0     0     0     1
         0     0     0     1     0
         0     0     1     0     0
         0     1     0     0     0
         1     0     0     0     0
    
    B =
         1     0     0     0     0
         2     4     0     0     0
         3     6     9     0     0
         4     8    12    16     0
         5    10    15    20    25
    
    C =
         0     0     0     0     1
         0     0     0     1     1
         0     0     1     1     1
         0     1     1     1     1
         1     1     1     1     1
       

  3. Napište skript který nalezne minimum, maximum a jejich souřadnice v libovolném vektoru (uvažujte pouze první výskyt).

  4. Rozšiřte předchozí příklad tak aby fungoval i na matice. V případě, že bude minimálních či maximálních hodnot více určete všechny jejich souřadnice.

  5. Vytvoře skript který vypíše matici C v následujícím formátu.

    | XXX.X| XXX.XX| XXX.XXX| XXX.XXXX| XXX.XXXXX|
    | 326.8| 914.23| 494.428| 710.3683| 664.69605|
    | 831.9| 258.22| 769.753| 410.5198|  55.76007|
    | 870.9| 972.24| 116.940| 508.0272| 755.56151|
    | 109.9|  33.17| 441.425| 129.3269| 971.56759|
    | 940.8| 933.39| 983.621| 693.9652| 702.82847|
    | 371.8|  64.96| 443.183| 542.6704| 540.73560|
    | 786.8| 601.68| 947.330| 631.0347| 878.12019|
    | 122.3| 813.84| 977.901| 231.4499| 912.98854|
    | 676.0| 725.86| 685.529| 796.9755| 529.87722|
    | 754.2| 503.35| 907.058| 123.4441| 852.44109|
    Pro vygenerování matice použijte následující kód.
    C = rand(10,5) + randi([0 999], 10,5);

  6. Implementujte Floyd-Warshallův algoritmus na hledání nejkratší cesty v matici D. Algoritmus realizujte jako skript. Pro testování použijte následující matici.

    D =
         0     5   Inf     2   Inf
       Inf     0     2   Inf   Inf
         3   Inf     0   Inf     7
       Inf   Inf     4     0     1
         1     3   Inf   Inf     0
    

  7. Určete co dělá následující kód pro vstupní matici D.

    n = size(D, 1);
    
    for k = 1 : n
      fromitok = repmat(D(:,k), 1, n);
      fromktoj = repmat(D(k,:), n, 1);
      D = min(D, fromitok + fromktoj);
    end

David Kočíř after Martin Trnečka