Contents
Belső ábrázolás
Ha
a=5.5 whos
a = 5.5000 Name Size Bytes Class Attributes a 1x1 8 double
akkor látjuk hogy a értéke "double" tipusú valós értékként van tárolva 8 byteon. Lehet hogy mi olyan számokat próbálnánk eltárolni amik kisebb helyen is elférnek. Például
b=int8(6) whos
b = int8 6 Name Size Bytes Class Attributes a 1x1 8 double b 1x1 1 int8
Így "b" értéke olyan egész ami 0-tól 127-ig vesz fel értéket. Ha pélául az összes magyar ember gyermekeinek számát akarom eltárolni akkor szerencsésebb ilyen formába tárolni őket. De vigyázzunk mert:
c=a+b whos
c = int8 12 Name Size Bytes Class Attributes a 1x1 8 double b 1x1 1 int8 c 1x1 1 int8
ilyenkor az összeadásnál "a" értékét is egészre kerekíti a kövekezőképp:
int8(a)
ans = int8 6
Szövegek tárolása
Szövegeket tárolhatunk karaktervekotrokként és "string"-ként is. Pl:
s='Monoton üget a süppedő homokon a sivatag lova, a tétova teve tova...'
whos
s = 'Monoton üget a süppedő homokon a sivatag lova, a tétova teve tova...' Name Size Bytes Class Attributes a 1x1 8 double ans 1x1 1 int8 b 1x1 1 int8 c 1x1 1 int8 s 1x68 136 char
Látjuk, hogy itt az "s" változó egy karaktervektor.
s2=string(s) whos
s2 = "Monoton üget a süppedő homokon a sivatag lova, a tétova teve tova..." Name Size Bytes Class Attributes a 1x1 8 double ans 1x1 1 int8 b 1x1 1 int8 c 1x1 1 int8 s 1x68 136 char s2 1x1 232 string
Az "s2" változó típusa "string" (kicsit több helyet foglal mint a karaktervektor). A stringek és karaktervektorok kicsit máshogy viselkednek:
s3='Ez valami' s4='ez Valami' [s3 s4]
s3 = 'Ez valami' s4 = 'ez Valami' ans = 'Ez valamiez Valami'
például ha a karaktervektorokból alkotok vektort akkor összefűzi őket
s5=string(s4) [s2 s5]
s5 = "ez Valami" ans = 1×2 string array "Monoton üget a süppedő homokon …" "ez Valami"
Ha viszont stringeket rakok a vektorba akkor string vektort kapok. Ha például emeberek vezetékneveit kéne eltárolnom akkor az string vektorként érdemes. A karaktervektor/string felosztás a 2017a verzióban jelent meg először ezért a régebbi függvények a karaktervektorokat még stringnek rövidítik. Ha karaktervektorokat akarnánk összehasonlítani:
s3==s4
ans = 1×9 logical array 0 1 1 0 1 1 1 1 1
Akkor csak azonos hosszú vektorokat lehet összehasonlítani és kimenetként logikai vektort kapunk. Ha az szeretnénk tudni hogy a két karaktersorozat azonos-e akkor erre külön függvényt kell használnunk:
strcmp(s3,s4)
ans = logical 0
Vagy ha nem szeretnénk, hogy számítson a kisbetű, nagybetű akkor:
strcmpi(s3,s4)
ans = logical 1
Az isletter() függvény akkor ad igaz értéket, ha a bemeneti karakter betű (és nem space, vessző pont, stb).
isletter(s)
ans = 1×68 logical array Columns 1 through 19 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 Columns 20 through 38 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 Columns 39 through 57 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 Columns 58 through 68 1 1 1 0 1 1 1 1 0 0 0
karaktervektornál az isletter() kimenete egy logikai vektor. A karaktervektort számvektorrá is alakíthatjuk:
double(s)
ans = Columns 1 through 13 77 111 110 111 116 111 110 32 252 103 101 116 32 Columns 14 through 26 97 32 115 252 112 112 101 100 337 32 104 111 109 Columns 27 through 39 111 107 111 110 32 97 32 115 105 118 97 116 97 Columns 40 through 52 103 32 108 111 118 97 44 32 97 32 116 233 116 Columns 53 through 65 111 118 97 32 116 101 118 101 32 116 111 118 97 Columns 66 through 68 46 46 46
Így láthatjuk, hogy a Matlab milyen betűt milyen számként ábrázol.
Első közös feladat:
Írjunk olyan betuSzam nevű függvényt ami megszámolja a betűket egy bemenetként kapott karaktervektorban. Bónusz feladat: ha több bemenetet kap akkor a második bemenetként kapott karakterek számát számolja meg.
function ki=betuSzam(v,c) if nargin==1 ki=sum(isletter(v)); else ki=sum(double(c)==double(v)); end
Teszteljük:
betuSzam(s)
betuSzam(s,'a')
ans = 53 ans = 8
Látjuk hogy "string"-re nem működik a függvényük, mert pl:
double(s2)
ans = NaN
Viszont ha a "string"-et karaktervektorrá alakítom akkor igen:
double(char(s2))
ans = Columns 1 through 13 77 111 110 111 116 111 110 32 252 103 101 116 32 Columns 14 through 26 97 32 115 252 112 112 101 100 337 32 104 111 109 Columns 27 through 39 111 107 111 110 32 97 32 115 105 118 97 116 97 Columns 40 through 52 103 32 108 111 118 97 44 32 97 32 116 233 116 Columns 53 through 65 111 118 97 32 116 101 118 101 32 116 111 118 97 Columns 66 through 68 46 46 46
Első Házi feladat
Írjunk latinKodolo nevű függvényt ami a bemeneti karakervektort számmá alakítja hozzáad egyet majd visszalakítja szöveggé! Írjunk mellé egy dekodoló függvényt is!
function kimenet=latinKodolo(szoveg) kimenet=char(double(szoveg)+1); end
kodoltS=latinKodolo(s)
kodoltS = 'Npopupo!ýhfu!b!týqqfeŒ!ipnplpo!b!tjwbubh!mpwb-!b!uêupwb!ufwf!upwb///'
function kimenet=latinDekodolo(szoveg) kimenet=char(double(szoveg)-1); end
latinDekodolo(kodoltS)
ans = 'Monoton üget a süppedő homokon a sivatag lova, a tétova teve tova...'
Bónusz házi feladat
Írjunk olyan kódoló függvényt ami kap egy bemenetként egy kódolandó karaktervektort és egy "kulcs" karaktervektort. A "kulcs" karartervektort ismételje addig amíg olyan hosszú nem lesz mint a kódolandó karaktervektor. A két karaktervektor alakítsa számvektorrá, adja össze őket és kimenetet alakítsa vissza szöveggé. Írjunk ehhez egy dekódoló függvényt is.
function kimenet=kodolo(szoveg,kulcs) ciklikuskulcs=[repmat(kulcs,1,floor(length(szoveg)/length(kulcs))),kulcs(1:mod(length(szoveg),length(kulcs)))]; kimenet=char(double(szoveg)+double(ciklikuskulcs)); end
kodoltS=kodolo(s,kulcs)
kodoltS = 'ÃÐÚÐáØäŨÈÒÝÂÔũÙæÆÐƲÑåÎÛÌÜ×ÂÔÖß×ÕÍÈÕå×ÍÊÕŕÕÜß×àÆãÎÕÛ×Τ'
function kimenet=dekodolo(szoveg,kulcs) ciklikuskulcs=[repmat(kulcs,1,floor(length(szoveg)/length(kulcs))),kulcs(1:mod(length(szoveg),length(kulcs)))]; kimenet=char(double(szoveg)-double(ciklikuskulcs)); end
dekodolo(kodoltS,kulcs)
ans = 'Monoton üget a süppedő homokon a sivatag lova, a tétova teve tova...'
Fájlkezelés
xls (xlsx) fájlokat az xlsread paranccsal lehet beolvasni. Például letöltve a 2015.xls-t a honlapról:
M=xlsread('2015szept.xls')
M = []
Látjuk, hogy számokat akarja kiszedni az xls táblázatból. Mivel egy olyen cella sincs ebben a táblázatban ami tiszán számot tartalmazna ezért üresen tér vissza. Vigyázat! Bizonyos funkciók csak akkor működnek, ha az Excel ois telepítve van a gépünkön.
Ha máshogy hívjuk meg az xlsread-et:
[szamok,szoveg,osszes]=xlsread('2015szept.xls')
szamok = [] szoveg = 31×10 cell array Columns 1 through 4 'D�tum ' '' '' 'Maxim�lis folyama…' '2015.09.01.' '17�C' '34�C' '24 Km/h' '2015.09.02.' '14�C' '30�C' '28 Km/h' '2015.09.03.' '15�C' '29�C' '15 Km/h' '2015.09.04.' '16�C' '26�C' '28 Km/h' '2015.09.05.' '15�C' '20�C' '26 Km/h' '2015.09.06.' '12�C' '20�C' '39 Km/h' '2015.09.07.' '10�C' '20�C' '34 Km/h' '2015.09.08.' '6�C' '19�C' '26 Km/h' '2015.09.09.' '3�C' '21�C' 'N/A' '2015.09.10.' '10�C' '17�C' 'N/A' '2015.09.11.' '14�C' '16�C' '15 Km/h' '2015.09.12.' '11�C' '21�C' '9 Km/h' '2015.09.13.' '12�C' '24�C' '22 Km/h' '2015.09.14.' '13�C' '27�C' '24 Km/h' '2015.09.15.' '18�C' '30�C' '22 Km/h' '2015.09.16.' '17�C' '30�C' '34 Km/h' '2015.09.17.' '19�C' '34�C' '34 Km/h' '2015.09.18.' '16�C' '31�C' '24 Km/h' '2015.09.19.' '18�C' '29�C' '24 Km/h' '2015.09.20.' '13�C' '24�C' '37 Km/h' '2015.09.21.' '9�C' '21�C' '22 Km/h' '2015.09.22.' '6�C' '21�C' '21 Km/h' '2015.09.23.' '14�C' '26�C' '16 Km/h' '2015.09.24.' '14�C' '27�C' '26 Km/h' '2015.09.25.' '17�C' '19�C' '16 Km/h' '2015.09.26.' '14�C' '17�C' '15 Km/h' '2015.09.27.' '13�C' '17�C' '16 Km/h' '2015.09.28.' '12�C' '18�C' '32 Km/h' '2015.09.29.' '11�C' '18�C' '29 Km/h' '2015.09.30.' '10�C' '16�C' '32 Km/h' Columns 5 through 7 'Maxim�lis sz�ll�k…' 'Napi �sszes csapa…' 'H�m�lys�g ' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '54 Km/h' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' '41 Km/h' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' '48 Km/h' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' Columns 8 through 10 'L�gnyom�s ' 'Ikon ' 'Le�r�s ' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' 'N/A' '' '' osszes = 31×10 cell array Columns 1 through 4 'D�tum ' [ NaN] [ NaN] 'Maxim�lis folyama…' '2015.09.01.' '17�C' '34�C' '24 Km/h' '2015.09.02.' '14�C' '30�C' '28 Km/h' '2015.09.03.' '15�C' '29�C' '15 Km/h' '2015.09.04.' '16�C' '26�C' '28 Km/h' '2015.09.05.' '15�C' '20�C' '26 Km/h' '2015.09.06.' '12�C' '20�C' '39 Km/h' '2015.09.07.' '10�C' '20�C' '34 Km/h' '2015.09.08.' '6�C' '19�C' '26 Km/h' '2015.09.09.' '3�C' '21�C' 'N/A' '2015.09.10.' '10�C' '17�C' 'N/A' '2015.09.11.' '14�C' '16�C' '15 Km/h' '2015.09.12.' '11�C' '21�C' '9 Km/h' '2015.09.13.' '12�C' '24�C' '22 Km/h' '2015.09.14.' '13�C' '27�C' '24 Km/h' '2015.09.15.' '18�C' '30�C' '22 Km/h' '2015.09.16.' '17�C' '30�C' '34 Km/h' '2015.09.17.' '19�C' '34�C' '34 Km/h' '2015.09.18.' '16�C' '31�C' '24 Km/h' '2015.09.19.' '18�C' '29�C' '24 Km/h' '2015.09.20.' '13�C' '24�C' '37 Km/h' '2015.09.21.' '9�C' '21�C' '22 Km/h' '2015.09.22.' '6�C' '21�C' '21 Km/h' '2015.09.23.' '14�C' '26�C' '16 Km/h' '2015.09.24.' '14�C' '27�C' '26 Km/h' '2015.09.25.' '17�C' '19�C' '16 Km/h' '2015.09.26.' '14�C' '17�C' '15 Km/h' '2015.09.27.' '13�C' '17�C' '16 Km/h' '2015.09.28.' '12�C' '18�C' '32 Km/h' '2015.09.29.' '11�C' '18�C' '29 Km/h' '2015.09.30.' '10�C' '16�C' '32 Km/h' Columns 5 through 7 'Maxim�lis sz�ll�k…' 'Napi �sszes csapa…' 'H�m�lys�g ' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '54 Km/h' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' '41 Km/h' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' '48 Km/h' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' 'N/A' '0mm' 'N/A' Columns 8 through 10 'L�gnyom�s ' 'Ikon ' 'Le�r�s ' 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN] 'N/A' [ NaN] [ NaN]
akkor a számok ugyan továbbra is üresek lesznek, de most azok a cellák amikben az Excel szerint szöveg van azok tartalmából is készít egy cell típusú tömböt. A Excel felépítése miatt ezeknek a celláknak az értéke bármi lehet (akár vektor, tömb vagy kép is).
szoveg(2,2)
ans = cell '17�C'
Látjuk hogy a szokásos hivatkozás itt nem vezet sehova (amit kapunk az még mindig cell típusú amivel sokmindent nem tudunk csinálni). Cell típusú tömb (vektor) elemeire a "{" "}" zárójelekkel kell hivatkozni. Pl:
szoveg{2,2}
ans = '17�C'
Szeretnének a cella értékét számként megkapni. Ehhez először levágjuk a karaktervektor végéről a "°C"-t.
fok=szoveg{2,2} fok(1:end-2)
fok = '17�C' ans = '17'
Majd a '17'-et 17 (számmá) alakítjuk.
str2num(fok(1:end-2))
ans = 17
Most meg szeretnénk kapni a napi minimumhőmérsékleteket egy (szám) vektorban:
Minhomerseklet=zeros(30,1); for i=2:31 Minhomerseklet(i-1)=str2num(szoveg{i,2}(1:end-2)); end
Második házi feladat
A fentiekből kindulva keressük meg azt a napot ahol a hőmérséklet ingadozás a legnagyobb.
[szamok,szoveg,osszes]=xlsread('2015szept.xls'); Minhomerseklet=zeros(30,1); for i=2:31 Minhomerseklet(i-1)=str2num(szoveg{i,2}(1:end-2)); end Maxhomerseklet=zeros(30,1); for i=2:31 Maxhomerseklet(i-1)=str2num(szoveg{i,3}(1:end-2)); end [ertek,nap]=max(Maxhomerseklet-Minhomerseklet)
ertek = 18 nap = 9
Bónusz házi fealadat
Keressük meg (programmal) azt az Esős/Viharos Esős napot ahol a hőmérséklet ingadozás a legnagyobb.
for i=2:31 Ido(i-1)=string(A{i,10}); end
esoVagyVihar=Ido==Ido(4)|Ido==Ido(19)
esoVagyVihar = 1×30 logical array Columns 1 through 19 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 0 0 0 1 Columns 20 through 30 1 0 0 0 0 1 1 1 0 0 0
[ertek,nap]=max(Maxhomerseklet(esoVagyVihar)-Minhomerseklet(esoVagyVihar))
ertek = 12 nap = 6
Napok=1:30; szurtNapok=Napok(esoVagyVihar) szurtNapok(nap)
szurtNapok = 4 5 6 10 11 15 19 20 25 26 27 ans = 15