Numeriska Metoder och Grundläggande Programmering för P1, VT2014 Föreläsning 5: Filhantering i Matlab Mer om datatyper: celltabeller, gles lagring (Kap. 7 & 8 i MATLAB Programming for Engineers, S. Chapman)
Mer of datatyper Gles lagring av matriser Celltabeller Filhantering i Matlab Läsning från tangentbordet, utskrift på skärmen Binär skrivning och inläsning med save och load Skrivning på och inläsning från textfil save och load Användning av filreferenser: öppna, stänga, filslut Binär skrivning och läsning med filreferens Skrivning och läsning med formatstyrning
Gles lagring av matriser Tabeller i Matlab sparar normalt varje element i minnet. Om de flesta elementen i en numerisk matris är nollor går det att vara mycket mer effektiv. Vid gles lagring sparas: nollskillda värden, och information of deras position Minnesåtgången blir mindre (om matrisen är tillräckligt gles) och om matrisen har en bra struktur kan numeriska metoder för att, t.ex., lösa linjära ekvationssystem bli mycket snabbare.
Gles lagring av matriser c l e a r A = d i a g ( ones (1000,1)+ rand ( 1 0 0 0, 1 ), 0 ) ; A = A + d i a g ( rand ( 9 9 9, 1 ), 1 ) ; A = A + d i a g ( rand (999,1), 1); spy (A) A g l e s = s p a r s e (A ) ; whos b = rand ( 1 0 0 0, 1 ) ;
Gles lagring av matriser t i c f o r k =1:50 x = A\b ; end m e d e l t i d = toc /50 t i c f o r k =1:50 x = A g l e s \b ; end m e d e l t i d = toc /50
Gles lagring av matriser e x e m p e l g l e s Name S i z e Bytes C l a s s A t t r i b u t e s A 1000 x1000 8000000 double A g l e s 1000 x1000 55976 double s p a r s e m e d e l t i d = 0.0144 m e d e l t i d = 1.3438 e 04 d i a r y o f f
Celltabeller I vanliga tabeller i Matlab är alla element av samma datatyp. Exempel: textsträngar som är vektorer av tecken, char matriser med numeriska värden I celltabeller kan olika element vara av olika datatyp. Såg exempel på celltabeller i samband med funktionsdefinitioner; fler exempel i dag. Skapa en celltabell med m rader och n kolumner genom A = cell(m,n); I varje position lagras då en tom tabell.
Celltabeller Exempel: A = c e l l ( 3, 2 ) ; A{1,1} = 4 5 ; A{1,2} = en t e x t ; A{2,1} = @( x ) s i n (3 p i x ) ; A{2,2} = eye ( 1 0 ) ; A{3,2} = c e l l ( 4, 4 ) ; d i s p (A) B = A( 1, 2 ) C = A{1,2} whos B C
Celltabeller Exempel: e x e m p e l c e l l t a b e l l [ 4 5 ] en t e x t @( x ) s i n (3 p i x ) [ 1 0 x10 double ] [ ] { 4 x4 c e l l } B = en t e x t C = en t e x t Name S i z e Bytes C l a s s A t t r i b u t e s B 1 x1 126 c e l l C 1 x7 14 char d i a r y o f f
Celltabeller Observera att: A(1,2) är en ny celltabell med 1 rad och 1 kolumn A{1,2} returnerar innehållet i position Allmänt ger A(rader,kolumner) en ny celltabell med innehållande de utvalda raderna och kolumnerna i A.
Läsning och skrivning, tangentbord och skärm
Läsning och skrivning, tangentbord och skärm Tidigare har vi hämtat data från tangentbordet och bara presenterat resultat på skärmen. In från tangentbordet: genom tilldelningskommando input(text till anv.), input(text till anv., s ), Ut på skärmen: tilldelning utan ; ger utskrift med variabelns namn disp(uttryck), ger utskrift utan variabelns namn fprintf(formatstr,uttryck,...), ger utskrift där formatsträngen styr hur uttryckens värdens skrivs ut. Ger mer kontroll över t.ex. radbrytning än disp.
Utskrift i kommandofönstret p i ans = 3.1416 d i s p ( p i ) 3.1416 format l o n g d i s p ( p i ) 3.141592653589793 format s h o r t d i s p ( [ T a l e t p i :, num2str ( p i ) ] ) T a l e t p i : 3.1416 d i s p ( [ T a l e t p i :, num2str ( pi, %16.15 f ) ] ) T a l e t p i : 3.141592653589793 f p r i n t f ( % s %16.15 f \n, T a l e t p i :, p i ) T a l e t p i : 3.141592653589793 d i a r y o f f
Exempel: tabell i kommandofönstret Vi vill skriva ut en tabell över trianglar s.a.: en vinkel är rät (Pythagoras sats) alla sidor har heltalslängder, den största sidlängden är högst 30
Exempel: tabell i kommandofönstret f p r i n t f ( \ n a b c\n ) f o r c = 1:30 c2 = c ˆ 2 ; f o r a = 1 : f l o o r ( s q r t ( c2 /2)) a2 = a ˆ 2 ; b = round ( s q r t ( c2 a2 ) ) ; i f end end end bˆ2 == c2 a2 f p r i n t f ( %5d%5d%5d\n, a, b, c ) ;
Exempel: tabell i kommandofönstret t a b e l l t r i a n g l a r a b c 3 4 5 6 8 10 5 12 13 9 12 15 8 15 17 12 16 20 7 24 25 15 20 25 10 24 26 20 21 29 18 24 30 d i a r y o f f
Läsning och skrivning, från och till fil När filen både skapas och läses in av Matlab: save och load När filerna används av både Matlab och andra program: fwrite, fread, (binärt) fprintf, fscanf, textscan, (formatstyrt, textfiler)
save Spara till fil save alla variabler i arbetsminnet sparas binärt till filen matlab.mat save filnamn alla variabler i arbetsminnet sparas binärt till filen filnamn.mat save filnamn variabellista variablerna i variabellistan sparas binärt till filen filnamn.mat Filerna är plattformsoberoende, men kan bara användas av Matlab. Använd save när data bara ska användas av Matlab. Kan spara i textfiler genom tillägget -ascii
load Läs från fil load alla variabler i filen matlab.mat läses in i arbetsminnet load filnamn alla variabler i filnamn.mat läses in i arbetsminnet load filnamn variabellista variablerna i variabellistan läses in från filnamn.mat till arbetsminnet
save f u l l m a t r i s A save g l e s m a t r i s A g l e s c l e a r whos l o a d f u l l m a t r i s l o a d g l e s m a t r i s whos Name S i z e Bytes C l a s s A t t r i b u t e s A 1000 x1000 8000000 double A g l e s 1000 x1000 55976 double s p a r s e d i a r y o f f
Läsning och skrivning med filreferens Matlab använder en filreferens för att hålla reda på en fil: vad programmet tillåts göra med filen, och aktuell position i filen. filreferens = fopen(filnamn,tillstånd) Tillstånd kan vara r, r+, w, w+, a, a+ Om öppningen misslyckades blir filreferensen -1. fclose(filreferens) Avsluta pågående utskrifter. Stäng filen. Vid lyckad stängning returneras 0, annars -1. feof(filreferens) Sant om inga data återstår att läsa, falskt annars.
Tillstånd r Öppna en existerande fil för att läsa r+ Öppna en existerande fil för att läsa och skriva w Radera innehållet i en existerande fil (eller skapa en ny tom fil) och öppna den för att endast skriva w+ Radera innehållet i en existerande fil (eller skapa en ny tom fil) och öppna den för att läsa och skriva a Öppna en existerande fil för att skriva i slutet av den existerande filen a+ Öppna en existerande fil för att skriva och läsa i slutet av den existerande filen
Binär läsning och skrivning med filreferens Skrivning binärt med filreferens: fwrite(filreferens,uttryck,precision) där precisionen kan vara t.ex. float64, float32, char,... Använd hjälpfunktionen för att se vad olika precisioner motsvarar i andra språk! Läsning binärt med filreferens: [variabel,antal] = fwrite(filreferens,storlek,precision) där antal är antalet lästa värden när inläsningen är klar, storlek anger hur många värden som önskas läsa in: ett tal, Inf, eller [m n] (läser sparar i m n tabell), och precision är som vid skrivning
Binär skrivning med filreferens Exempel: % Exempel b i n a r s k r i v n i n g med f i l r e f e r e n s A = randn ( 2, 2 ) ; u t f i l = fopen ( t e s t f i l. dat, w ) ; a n t a l = f w r i t e ( u t f i l, A, f l o a t 6 4 ) ; d i s p ( [ i n t 2 s t r ( a n t a l ), t a l s k r e v s t i l l f i l ] ) ; f c l o s e ( u t f i l ) ; c l e a r u t f i l ;
Binär läsning med filreferens Exempel: % Exempel b i n a r l a s n i n g med f i l r e f e r e n s i n f i l = fopen ( t e s t f i l. dat, r ) ; B = f r e a d ( i n f i l, [ 2 2 ], f l o a t 6 4 ) ; f c l o s e ( i n f i l ) ; c l e a r i n f i l ;
Läsning och skrivning med formatstyrning Skrivning som text med filreferens: fprintf(filreferens,formatsträng,uttryck) där formatsträng styr utskriftens utseende sprintf(formatsträng,uttryck) returnerar en sträng i stället för att skriva till fil Läsning från textfil med filreferens: [variabel,antal] = fscanf(filreferens,formatsträng,storlek) där antal är antalet lästa värden när inläsningen är klar, storlek anger hur många värden som önskas läsa in: ett tal, Inf, eller [m n] (läser sparar i m n tabell), och formatsträng är som vid skrivning CT = textscan(filreferens,formatsträng,antal läser kolumnuppdelad text
Formatsträngar består av formatkoder, specialtecken, och annan text. En formatkod har formen %[- + 0][n.n]k % och k är obligatoriska delar, några möjliga värden på k är: c ett tecken s en sträng i ett heltal (med tecken) e exponentform f decimalbråk g kortaste av e och f De möjliga värdena på de valfria delarna är: - vänsterställ + sätt alltid ut tecken 0 fyll ut med inledande nollor n. totalt antal tecken.n antal siffror/decimaler
Formatsträngar Specialtecken är bland andra: %% procenttecken apostrof \f sidmatning \n ny rad \r vagnretur \t tabulatortecken Uttrycket kombineras med formatkoderna. När formatsträngen tar slut används den från början igen. Exempel: f p r i n t f ( % f \ t %.8 f \ t %.8e\n, s q r t ( 2 ) ( 1 : 1 0 ) ) 1.414214 2.82842712 4.24264069 e+00 5.656854 7.07106781 8.48528137 e+00 9.899495 11.31370850 1.27279221 e+01 14.142136 d i a r y o f f
Formatstyrd skrivning med filreferens Exempel: % Exempel f o r m a t t e r a d s k r i v n i n g med f i l r e f e r e n s u t f i l = fopen ( t e s t f i l f. dat, wt ) ; a n t a l = f p r i n t f ( u t f i l, %16.15 e,a ) ; d i s p ( [ i n t 2 s t r ( a n t a l ), t e c k e n s k r e v s t i l l f i l ] ) f c l o s e ( u t f i l ) ; c l e a r u t f i l ;
Formatstyrd läsning med filreferens Exempel: % Exempel f o r m a t t e r a d l a s n i n g med f i l r e f e r e n s i n f i l = fopen ( t e s t f i l f. dat, rt ) ; C = f s c a n f ( i n f i l, % f ) ; f c l o s e ( i n f i l ) ; c l e a r i n f i l ;
Formatstyrd läsning med filreferens; Lab. 3 Exempel: Öppna en textfil innehållande en krypterad text, läs in och spara i en textsträng: %k r y p t o.m, v i s a r f i l h a n t e r i n g : % t e x t f i l t i l l t e c k e n v e k t o r f i d=fopen ( k r y p t e r a d 1. txt, rt ) ; t e x t=f s c a n f ( f i d, % c, I n f ) ; f c l o s e ( f i d ) ; c l e a r f i d ;
Direktåtkomst av olika delar av en fil Man kan styra var i en fil läsning och skrivning ska ske: frewind(filreferens), sätter aktuell position till början av filen ftell(filreferens), get aktuell position i byte från filbörjan fseek(filreferens,position,origo), sätter aktuell position till position byte efter origo; tre möjliga värden på origo: -1 är filbörjan, 0 är aktuell position, 1 är filslut
Exempel på inläsning av tabellerad text. I textfilen Aktiviteter vardag.csv finns följande tabell: A c t i v i t y Time Eat 2. 5 S l e e p 7. 5 Commute 1. 5 Work 8 L e i s u r e 4. 5 Vi vill skapa ett cirkeldiagram med aktiviteterna ordnade efter tid i fallande ordning.
Exempel på inläsning av tabellerad text. c l e a r ; c l c d a t a f i l = fopen ( A k t i v i t e t e r v a r d a g. csv, rt ) ; t i t e l r a d = t e x t s c a n ( d a t a f i l, % s %s, 1 ) ; data = t e x t s c a n ( d a t a f i l, % s %f ) ; f c l o s e ( d a t a f i l ) ; c l e a r d a t a f i l a k t i v i t e t = data {1}; t i d = data {2}; [ t i d s, i n d e x ] = s o r t ( t i d, descend ) ; f i g u r e p i e ( t i d s, a k t i v i t e t ( i n d e x ) ) ; t i t l e ( Week Day A c t i v i t i e s )
Week Day Activities Commute Eat Work Leisure Sleep
I mån av tid: publish diary print