Portál AbcLinuxu, 1. května 2025 16:07
Přístup k souborům a složkám operačního systému, naplnění matice ze souboru a uložení obsahu matice do souboru.
Pomalu se propracováváme k využívání souborů v Octave - buď jako úložiště dat nebo programů. Proto nesmí chybět seznámení, jak lze souborový systém v Octave správně uchopit. Začněme příkazy známými z shellu: pwd (Path to Working Directory) a cd (Change Directory):
% Ve Windows >> pwd /octave_files >> cd c:\matlab >> pwd /cygdrive/c/matlab % V Linuxu >> pwd /home/user >> cd /tmp >> pwd /tmp
V Linuxu bývá po spuštění aktuální složkou ta, ve které jsme Octave spustili, a s přístupem do jiných složek není žádný problém. V prostředí Windows běží Octave s pomocí Cygwin, jako kořenový adresář se nastavuje složka, ve které je Octave nainstalováno - přístup do jiných složek nicméně možný je, jednotky diskových oddílů se mapují do virtuálního adresáře cygdrive. Ve Windows je možno jako oddělovač složek použít obou lomítek - těch rozdílů mezi linuxovou a windowsovou verzí Octave lze při práci se soubory zaznamenat více.
Pro výpis souborů v aktuální složce slouží příkazy ls a dir:
>> ls data funkce.m skript.m >> dir ('/data/matlab') data funkce.m skript.m
Seznam souborů ze zadané složky lze uložit do matice pomocí funkce readdir:
>> files=readdir('.') files = . .. data funkce.m skript.m
Znak tečka zde označuje aktuální složku.
Octave samozřejmě umí vytvářet a mazat adresáře, přejmenovávat soubory apod. Názvy souborů a adresářů se zadávají jako textové parametry funkcí, které - pokud operace dopadla úspěšně - vrací hodnotu 0:
>> ls data funkce.m skript.m >> mkdir('slozka') % Vytvoř novou složku slozka ans = 0 >> ls data funkce.m skript.m slozka >> rmdir('slozka') % Smaž složku slozka ans = 0 >> ls data funkce.m skript.m
Funkce mkdir vytvořila složku pojmenovanou slozka, kterou následně smazala funkce rmdir. Soubor se maže funkcí unlink a přejmenovává pomocí rename:
>> ls data funkce.m skript.m >> unlink('data') % Smaž soubor data ans = 0 >> rename('skript.m','program.m') % Přejmenuj skript na program ans = 0 >> ls funkce.m program.m
Pro pečlivky - uvedené funkce mohou vracet dvouprvkový vektor
[navratova_hodnota, text_chybove_zpravy]
, tj. pokud je
návratová hodnota nenulová, z textu chybové zprávy můžeme vypátrat, v čem
tkví problém. Případné zájemce o další podrobnosti a „systémové
utility“ opět odkáži na dokumentaci. Zde uvedeme již jen užitečný
příkaz diary - s jeho pomocí lze veškerý výstup v terminálu
kopírovat do zvoleného souboru:
>> diary lekce3.txt >> A=34; B=A/7; >> diary off
Předchozí příkazy zařídí vytvoření souboru lekce3.txt, jehož obsahem budou řádky uvedené dál až po příkaz diary off, který toto logování vypíná. Opětovně lze zapnout s parametrem on.
Již dříve jsme uvedli, že matici je možno naplnit výčtem jejích jednotlivých prvků nebo funkcí, jako jsou například zeros, eye, rand apod. Další možností, jak tohoto dosáhnout, je nahrání dat ze souboru. Mějme například textový soubor mereni.txt s následujícím obsahem:
--[soubor mereni.txt]-- 12 3 5.4 76 1 2 4.3 89 -1 +5 9.999 100 --[konec souboru]--
Vidíme, že se jedná o matici správně zapsaných čísel, a tudíž obsah tohoto souboru můžeme nahrát do proměnné v Octave pomocí příkazu load:
>> load mereni.txt >> whos prot type rows cols name ==== ==== ==== ==== ==== rwd matrix 3 4 mereni >> mereni mereni = 1.0e+02 * 0.12000 0.03000 0.05400 0.76000 0.01000 0.02000 0.04300 0.89000 -0.01000 0.05000 0.09999 1.00000
Z výpisu příkazu whos vidíme, že nám vznikla nová proměnná mereni čítající tři řádky a čtyři sloupce - Octave proměnnou automaticky pojmenovává podle názvu souboru bez přípony. Z výpisu obsahu proměnné mereni pak vidíme, že skutečně obsahuje ta čísla, která jsou uložena v souboru mereni.txt. Tímto způsobem můžeme relativně snadno do Octave dostat kvanta čísel „získaná někde jinde“, například z nějakého tabulkového kalkulátoru, a dále zpracovávat.
Pokud by již existovala proměnná pojmenovaná stejně jako nahrávaný
soubor (což nastane typicky tehdy, když se pokoušíme nahrát jeden soubor
opakovaně), Octave vypíše varování a soubor nenahraje. Přepsání lze donutit
přepínačem -force
uvedeným bezprostředně za příkazem
load:
>> load mereni.txt warning: load: local variable name `mereni' exists warning: use `load -force' to overwrite >> load -force mereni.txt
Pro ukládání obsahů proměnných do souborů existuje příkaz save:
>> save mereni
Uvedený příkaz zapříčiní vytvoření souboru mereni v aktuální složce, který ovšem po otevření v nějakém textovém editoru nebude uživatelsky moc čitelný. Octave totiž obsahy proměnných ve výchozím nastavení ukládá do binárních souborů, které oproti čistému textu nabízí následující výhody:
Naproti tomu je čistý text snadno čitelný uživatelem a dá se importovat do jiných programů; volba vhodného formátu se tedy odvíjí od toho, co uživatel s uloženými daty zamýšlí:
-ascii
- uloží data jako čistý text-binary
- binární formát Octave, hodí se pro zálohu
dat-mat-binary
- binární formát Matlabu od verze 5, lze tedy
použít pro přenos dat z a do Matlabu-hdf5
- volně využitelný univerzální binární formát
používaný některými vědeckými aplikacemiVolbu formátu zajistíme prvním parametrem příkazu save, druhý parametr vymezuje jméno souboru a následující pak názvy proměnných, které se mají uložit. Neuvedeme-li žádnou proměnnou, uloží se všechny z aktuálního paměťového prostoru (tj. ty, které vypíše příkaz who). Následující příkaz tedy uloží matici mereni v čistém textu do souboru mereni-cisty_text.txt:
>> save -ascii mereni-cisty_text.txt mereni
Výchozí formát, ve kterém se mají proměnné do souborů ukládat, lze nastavit v zabudované proměnné default_save_format. Podobně proměnná save_precision upřesňuje, kolik desetinných míst se má ukládat, pokud je jako formát zvolen čistý text.
Dodejme ještě, že příkaz load automaticky detekuje formát souboru, z kterého nahrává - nicméně stejnými parametry jako u příkazu save jej můžeme donutit, aby předpokládal zadaný formát u nahrávaného souboru. Podobně lze za název souboru uvést seznam proměnných, které se ze souboru mají nahrát (v případě binárních formátů), bez uvedení se nahrají všechny proměnné.
>> plot(t,y) >> Timeout: gnuplot is not ready Signal 127 warning: connection to external plotter (pid = 509527) lost -- warning: please try your plot command(s) again
Týká se ukládání a načítání dat ze souboru. Dá se octave nějak donutit, aby uložila jenom samotná data, bez těch prvních asi pěti řádků s popisem, jako to dělá při parametru -text/-ascii příkazu save?
Pak když je chci znova načíst v dalším skriptu, obvykle zapomenu, jak se ta proměnná jmenovala, a načte se mi to trošku podivně. Zkuste sekvenci následujících tří příkazů:
A = rand(4,3)
save -text 'A.txt' A
B = load -text 'A.txt'
Postupně jsem přišel na to, že když z uloženého souboru A.txt umažu těch pár popisných řádků, vše funguje, jak má, ale je to takové divné řešení. Nevíte, jak na to?
load 'promenne.txt'obnoví všechny proměnné z uvedeného souboru a
B = load 'promenne.txt'obnoví všechny proměnné organizované v datové struktuře se jménem B, takže k jednotlivým proměnným lze přistupovat jako B.<název proměnné>, v popisovaném případě tedy jako B.A.
Ta volba -text je poměrně nová. V Octave 2.1.71 už je. Měla by být stejná jako volba -ascii. Tu jsem používal dříve, ale prý se má používat -text:
octave:2> save -ascii 'A.txt' A
warning: the meaning of this option will change in a future
warning: version of Octave to be compatible with Matlab.
warning: To keep the meaning of your code the same across
warning: this change, use the -text option instead.
octave:3> version
ans = 2.1.71
Problém bude asi spíše ve mně, měl bych zkusit používat rozumné názvy proměnných a důsledně podle nich pojmenovávat soubory, do kterých je ukládám. Nebo se naučit používat nějaké ty nízkoúrovnové operace se soubory.
Jinak te seriál je skvělý.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.