Body zdarma PHP týden
Pouze tento týden sleva až 80 % na PHP e-learning
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde

Lekce 2 - První skript a základní příkazy

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V dnešní lekci si ukážeme, jak vytvoříme vlastní skript. Nebojte se, není to nic složitého. Takže se dáme do toho... ;)

Vytvoření skriptu

Po tom, co se vám MATLAB načetl, zvolte v záložce HOME -> New -> Script nebo jednoduše použijte klávesovou zkratku Ctrl + N. Měl by se vám otevřít MATLABovský editor a to buď přímo implementovaný do hlavního okna nebo jako samostatné okno. Pokud vám vaše rozložení nevyhovuje, vraťte se o lekci zpět a tam najdete odpověď na váš problém.

Pokud tedy máme již otevřen nový skript, bylo by fajn, kdybychom jej také hned uložili, protože okamžitě uvidíme, ve které složce se pohybujeme (což je docela užitečné vědět, pokud pracujeme se soubory). MATLAB má vlastní příponu svých skriptových souborů a jedná se o takzvaný m-file (.m).

Doporučená hlavička každého skriptu

Na začátku každého skriptu bychom si měli zajistit, že máme pracovní plochu čistou, a to proto, aby nám nevznikaly chyby zapříčiněné proměnnými z posledních prací. Dále by také bylo dobré uzavřít všechna okna s grafy a ostatními vykreslovanými prvky. A nakonec také vymazat obsah konzole (Command Window - CW).

close all; % Zavři vše
clear; % Smaž vše
clc; % Vyčisti Command Window

Příkaz close <parametr> uzavře okno dle názvu zadaného jako parametr (např. close okno1). Pro uzavření všech oken slouží parametr all.

Příkaz clear <parametr> smaže proměnnou dle názvu zadaného jako parametr (např. clear a). Pro smazání všech proměnných zadáme příkaz bez parametru (případně s parametrem all, který se dnes již nedoporučuje používat).

Příkaz clc vymaže veškerý obsah Command Window.

Komentáře

Jak jste si jistě všimli o kousek zpět, tak se v kódu nacházejí komentáře. MATLAB má jako označovací znak komentářů procento %:

% Toto je obyčejný řádkový komentář

Dejte si pozor na příliš dlouhé komentáře. Pokud jste nezměnili v nastavení zalamování řádků, tak se vám budou komentáře automaticky zalamovat po asi 80 znacích. To by nebyl takový problém, ale na dalším řádku se nevytváří další procento a text se začne brát jako součást kódu. Začnete-li komentář dvěma procenty (%% text) při zapnutém módu buněk/sekcí (Cell mode), se vytvoří nová sekce s názvem uvedeným po mezeře za procenty. Tyto sekce se pak dají spouštět jednotlivě.

%{
Toto je blokový komentář.
V editoru se pak nabízí krásná možnost tento blok skrýt.
%}

Počáteční a koncové dva znaky %{ a %} blokového komentáře musí být na samostatném řádku.

Proměnné

Definice proměnných je velmi snadnou záležitostí. V MATLAB není třeba definovat žádné datové typy proměnných, o to vše se stará MATLAB sám. Jediná situace, kdy by se měl uživatel starat o datové typy, je chvíle, když chce pracovat s hodnotami v určitém datovém typu (např. při práci s obrazem). Ale teď již k našim definicím proměnných.

Jednorozměrné proměnné

a = 1
b = 0.2;

Přestože se tato definice dvou proměnných může zdát naprosto stejnou, tak je v ní rozdíl. Zápisem a = 1 definujeme proměnnou a a zároveň ji necháváme vypsat do Command Window. Kdežto druhá definice a to proměnné b definuje pouze hodnotu dané proměnné bez jejího výpisu. A ještě pozor na správný zápis desetinného čísla, vždy s tečkou! Čárka slouží k rozdělení čísel ve vektoru (stejně jako mezera, viz níže).

Vektory

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Chceme-li generovat nějakou posloupnost hodnot s určeným krokem, vytvoříme tedy vektor, a to je v podstatě matice 1 x n (nebo n x 1). V MATLAB budete pracovat hlavně s maticemi a jsou proto také uzpůsobeny veškeré jeho funkce. Ukážeme si, jak je možné nadefinovat vektor a matici.

v1 = [1 2 3 4 5]
v2 = [1, 2, 3, 4, 5]

Mezi definicí těchto dvou vektorů v1 a v2 není kromě absence čárek žádný rozdíl. Definujeme řádkový vektor s pěti prvky nebo matici s jedním řádkem a pěti sloupci. Je tedy možné oddělovat sloupce buď mezerami, nebo čárkami. A pokud se podíváte o krok zpět, tak si jistě vzpomenete, že obě tyto proměnné se nám vypíší do Command Window, protože nejsou zakončeny středníkem.

Matice

M1 = [1, 2, 3, 4, 5; 6, 7, 8, 9, 10; 11, 12, 13, 14, 15]

Zde již definujeme matici o třech řádcích a pěti sloupcích. Každý řádek je oddělen středníkem. Budete-li definovat nějakou matici s určitým rozměrem a nebudete si jisti, co se píše první, tak si vždy řekněte, že je to stejné jako násobení dvou matic (Řádek x Sloupec).

Generování posloupností

Obecná definice pro posloupnost s určitým krokem je p : krok : k, kde p znamená počáteční hodnotu, krok je snad jasný (může být též záporný a posloupnost bude klesající) a k je koncová hodnota (např. 0:2:10, samozřejmě je lepší psát to bez mezer. Jsou zde pouze pro lepší přehlednost).

v1 = 1 : 10
v2 = 0 : .5 : 5
M1 =[1:3; 4:6; 7:9]

Takže k popisu. Vektor v1 jsme vygenerovali od jedné do desíti s krokem jedna, který není třeba psát. Vektor v2 je již generován s krokem 0.5, který je schválně zapsán zkráceně, abych vám ukázal další možnost zápisu desetinného čísla začínajícího nulou. A konečně k naší záhadné matici M1. Jde o matici 3x3 a generování čísel tak, jak jsme si ukázali u vektoru v1.

Výpis do Command Window

Pro výpis do Command Window je spoustu možností. Existuje nepřeberné množství funkcí, kterými docílíme výpisu přesně takového, jaký potřebujeme.

Základní výpis bez užití funkce

Nejjednodušší možností je zapsat do kódu pouze název proměnné bez zakončení středníkem.

Kód:

a = 1; % Nadefinování hodnoty
a % Výpis

Výstup:

a =

     1
>>

Funkce disp()

Použít můžeme i funkci disp(<parametr>), kde můžeme jako parametr použít buď pouze název proměnné (disp(a)), přičemž výstup bude naprosto stejný jako o krok výše. Tato funkce je ovšem docela užitečná pro výpis textových řetězců. Pozor na apostrofy na místo uvozovek (disp('Retezec'))!

Kód:

disp('Ahoj Svete!');

Výstup:

Ahoj Svete!
>>

Chcete-li vypisovat také nějaké proměnlivé argumenty a přitom použít funkci disp(), je to samozřejmě možné, ovšem poměrně složité. Ukáži vám to na jednoduchém případě, kdy zadáte nějakou hodnotu a program ji následně vypíše. Tím si ukážeme zároveň i vkládání hodnot do programu skrze funkci input(<retezec dotazu>, <navracet retezec?>), která nám navrací hodnotu do proměnné a pokud má jít o textový řetězec, přidáváme za dotaz ještě parametr 's' :)

Kód:

disp('Ahoj.');
Jmeno = input('Napis mi sve jmeno: ', 's');
Vek = input('A kolik je Ti?: ');

disp(['Jmenujes se ', Jmeno, ' a je Ti ', num2str(Vek), ' let.']);

Výstup:

Ahoj.
Napis mi sve jmeno: David
A kolik je Ti?: 20
Jmenujes se David a je Ti 20 let.
>>

Zde jsme poměrně složitě vypsali text a nějaké proměnné, ale také jsme si ukázali načítání jednotlivých hodnot. Dále jste si mohli všimnout funkce num2str(<proměnná>), která převádí číselnou hodnotu na textový řetězec. A abych to uvedl na pravou míru, tak si povšimněte, že funkce disp() obsahuje jako parametr jen textové hodnoty a to ještě uzavřené hranatými závorkami, které vždy označují hodnotu vícerozměrné proměnné! Jde tedy o úplně stejný případ jako na začátku a vypisujeme hodnotu vektoru, který je složen z textových řetězců. Pro úplné pochopení ukáži příklad.

Úsek 1:

disp(['Jmenujes se ', Jmeno, ' a je Ti ', num2str(Vek), ' let.']);

Úsek 2:

Retezec = ['Jmenujes se ', Jmeno, ' a je Ti ', num2str(Vek), ' let.'];
disp(Retezec);

Výstup u těchto dvou úseků kódu bude naprosto totožný.

Funkce fprintf()

Dále se nabízí možnost vypisovat řetězce textu a ostatní proměnné stejně jako v jazyku C. A to použitím funkce fprintf(<datový proud>, 'text', <argumenty>...). Datový proud zapisujeme pouze pokud pracujeme se soubory.

Kód:

a = 1;
b = .2;
c = 'retezec';

fprintf('Toto je cele cislo: %d\n', a);
fprintf('Toto je desetinne cislo: %f\n', b);
fprintf('Toto je text: %s\n', c);

Výstup:

Toto je cele cislo: 1
Toto je desetinne cislo: 0.200000
Toto je text: retezec
>>

Dva znaky \n na konci textů znamenají konec řádku stejně jak je to ve spoustě dalších programovacích jazycích.

  • %d – Znamená, že na místo těchto znaků bude vypsáno celé číslo. Možno použít také %i.
  • %f – Znamená, že na místo těchto znaků bude vypsáno desetinné číslo.
  • %s – Znamená, že na místo těchto znaků bude vypsán textový řetězec.

Samozřejmě je možné použít všechny tyto argumenty najednou, pak je ovšem třeba napsat za text proměnné ve správném pořadí.

fprintf('Toto je cele cislo: %d\nToto je desetinne cislo: %f\nToto je text: %s\n', a, b, c);

Další možnosti formátování můžete nalézt zde.

To by bylo pro tuto lekci asi vše. Příště, v lekci Práce s maticemi a vektory, si ukážeme práci s maticemi a vektory.

Pár upozornění na závěr

  • Definice proměnné zakončená středníkem se vám nevypíše do Command Window, takže se pak nelekejte, že se vám proměnná nevytvořila. Opravdu je tam... ;)
  • Nepleťte si při zápisu desetinných čísel čárku a tečku. Desetinné číslo vždy s tečkou.
  • Pokud zadáváte vícerozměrné proměnné, hodnoty uvádějte do hranatých závorek.
  • Matice je definována vždy jako řádek x sloupec. Řádky se oddělují středníky a sloupce čárkami či mezerami a vše to musí být v hranatých závorkách!
  • Pokud vám MATLAB vypíše do Command Window nějakou chybu, tak většinou píše, opravdu, o jakou chybu se jedná. A myslím, že každý alespoň trošičku zběhlý v angličtině by si s tím měl poradit. Kdyby ne, tak se alespoň zaměřte na číslo řádku, které vám vypsal ;)

 

 

Článek pro vás napsal David Oczka
Avatar
Jak se ti líbí článek?
6 hlasů
Autor se věnuje vývoji aplikací pro medicínské účely. Momentálně se zabývá vývojem webových aplikací s použitím frameworku Symfony. Další oblasti, ve kterých se nejčastěji pohybuje, jsou C#, Java, Android, Matlab, C/C++ a okrajově i VHDL nebo iOS.
Předchozí článek
Seznámení s uživatelským prostředím
Všechny články v sekci
Matlab
Miniatura
Následující článek
Práce s maticemi a vektory
Aktivity (4)

 

 

Komentáře

Avatar
TH23
Člen
Avatar
TH23:21.10.2013 19:35

Tak jestli mohu, měl bych pár postřehů k tomuto článku:

  1. Umístění je vždy důležité, protože při spouštění skriptů musí být daný skript uložen v cestách ke skriptům (paths), nebo musí být v aktuálně otevřené složce (Current Folder). Nebylo by od věci na to upozornit, protože až pak někdo spustí skript a vyskočí na něj známá tabulka s umístěním souboru, bude vědět o co jde:)
  2. Komentář %% TEXT_KOMENTARE je tzv. sekce. Nejen že sekce lze sbalit/rozbalit pro zpřehlednění napsaného kódu (Preferences -> Editor/Debugger -> Code Folding -> Enable Sections), ale především lze sekce spouštět samostatně bez spuštění kódu z jiných sekcí (např. pravým tlačítkem myši -> Evaluate Current Section)
  3. Každá proměnná v Maltabu je matice. I jedno číslo je matice [1x1].
  4. Určitě bych zmínil více formátovacích znaků, jako jsou např. %3.3f, %e, %g atd., nebo bych odkázal na nápovědu.
  5. Popis nápovědy - to zoufale chybí. V Command Window help nazev_prikazu, ve scriptu pokud je kurzor v textu příkazu zmáčknutí F1 - nezbytné minimum

Doufám, že mé poznámky budou k užitku :)

 
Odpovědět  +1 21.10.2013 19:35
Avatar
David Oczka
Redaktor
Avatar
Odpovídá na TH23
David Oczka:21.10.2013 20:49

Vím, že to není dokonalé, ale když píšu, tak si prostě nevzpomenu na všechno... To, že jsem základ, a tím je nápověda, kterou sám také často používám, nepřidal, jsem si uvědomil docela nedávno, ale nemám teď vůbec čas ani na opravu. Snad ten kdo to bude číst, koukne i do komentářů... Jinak děkuji za opravu... :)

 
Odpovědět 21.10.2013 20:49
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Miroslava Puškašová:16.2.2015 12:19

Ahoj, mám jeden, dotaz. Dělám v matlabu asi 10 minut, nikdy předtím jsem v něm nepracovala. Píšete, že se příkazy zadávají do New script (ctrl + N). Když to udělám vyskočí mi okno editor, kam i když napíšu nějaké příkazy (je jedno jestli s ; nebo bez ; ) vůbec nic se neděje. Pokud je zapíšu do command window vše funguje. Ale proč bych tedy otevírala nějaký skript? Na co je ten skript? (asi blbá otázka, ale předem děkuji za odpověd) :D :)

 
Odpovědět 16.2.2015 12:19
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Miroslava Puškašová
Matěj Kripner:21.6.2016 17:13

Musíš ten skript spustit.

Odpovědět 21.6.2016 17:13
Give me a deep enough pipeline, and I shall move the world.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.