středa 15. dubna 2009

Apostrof v řetězci

Práce s řetězci je v Matlabu velmi jednoduchá a téměř intuitivní. Však je také tato problematika popisována hned v úvodních kapitolách většiny učebnic. Zkráceně, řetězec vytvoříme většinou tak, že požadovaný text “obalíme” apostrofy:

'textový řetězec'
ans =
textový řetězec

Samozřejmě, že s tako vytvořeným řetězcem můžeme dále libovolně nakládat a zpracovávat ho mnoha funkcemi Matlabu pro práci s řetězci. Spojování řetězců se provádí pomocí funkce strcat, nebo stejně jako spojování matic, pomocí hranatých závorek:

['textový', 'řetězec']

Na jednu záludnost však narazit můžeme a to tehdy pokud do řetězce potřebujeme vložit apostrof. V českém textu se apostrof vyskytuje velmi zřídka, nicméně v anglickém textu je tomu naopak viz: “I’m …”. Pokud tedy potřebujete vložit apostrof do řetězce musíte apostrof napsat dvakrát za sebou:

'I''m'
ans =
I'm

Druhým typickým místem, kde se setkáte s potřebou uvádět apostrof do řetězce je příprava kódu pro funkci eval. Například pokud chceme transponovat matici, jejíž jméno je uloženo v proměnné jmenoMatice, bude volání funkce eval vypadat následovně:

A = [1 2;3 4]
jmenoMatice = 'A';
eval([jmenoMatice ''''])
A =
1 2
3 4

ans =
1 3
2 4

Uvedení čtyř apostrofů je zde zcela v pořádku a ve finále opravdu vygeneruje apostrof jeden. První apostrof uvozuje začátek řetězce, následně jsou uvedeny dva apostrofy jenž se sloučí v apostrof jeden a poslední ukončuje řetězec. Funkce eval tedy zpracovává řetězec “A'”.

K sepsání tohoto příspěvku mě inspirovala diskuze GUI : evalin with a condition na comp.soft-sys.matlab diskuzní skupině.

středa 8. dubna 2009

Existence proměnné v (.mat) souboru

Pokud potřebujete zjistit zda v datovém souboru Matlabu (.mat) existuje nějaká proměnná, je nejelegantnější možností zavolat příkaz who s parametrem '-file'. Dalšími parametry jsou jméno datového souboru a jména proměnných k otestování. Při zadávaní jména proměnné můžete také použít zástupný znak *.

Návratovou hodnotou funkce who (za předpokladu že je požadována) je cell obsahující seznam všech názvů vyhovujících vstupním požadavkům. Pokud nás zajímá pouze existence proměnné otestujeme cell následně pomocí funkce isempty.

Příklad 1:

% Definice proměnných
var1 = 'a';
var2 = 'b';
dat1 = 1;
dat2 = 2;

% Uložení proměnných do souboru
save datafile

% Testování existence proměnných
varListAll = who('-file', 'datafile')
varListOne = who('-file', 'datafile', 'var1')
varListTwo = who('-file', 'datafile', 'var1','dat2')
varListNoE = who('-file', 'datafile', 'novar')
varListWhi = who('-file', 'datafile', 'var*')

varExist = ~isempty(who('-file', 'datafile', 'var1'))
varListAll =
'dat1'
'dat2'
'var1'
'var2'

varListOne =
'var1'

varListTwo =
'dat2'
'var1'

varListNoE =
{}

varListWhi =
'var1'
'var2'

varExist =
1

“Prostor pro Matlab” začíná

Ahoj,
vítám vás na blogu “Prostor pro Matlab”. Již celkem dlouho si hraju s myšlenkou, že bych rád někde publikoval zajímavé kousky kódu pro Matlab. Půjde většinou o krátké kousky kódu o pár řádcích, ale rád bych, aby byly vždy v něčem zajímavé. Aby nešlo jen o překlad dokumentace, ale o výběr té správné kombinace parametrů, tak aby byl kód co možná nejzajímavější.

Michal