Hetedik labor
Contents
Adattípusok, adatok importálása és exportálása
Egészek
Az alapértelmezett típus a double (lebegőpontos szám). Ha biztosan tudjuk, hogy egy változóban csak kicsi egészeket szeretnénk használni, akkor konvertálhatjuk kevesebb memóriát igénylő int8 típusra, ez nyolcadakkora helyet foglal mint a double.
a=5.5
a = 5.5000
b=int8(5)
b = int8 5
whos
Name Size Bytes Class Attributes a 1x1 8 double b 1x1 1 int8
De vigyázzunk, mert
c=a+b %miért lett 11?
c = int8 11
whos % itt a magyarázat, mert ő is egész típusú
Name Size Bytes Class Attributes a 1x1 8 double b 1x1 1 int8 c 1x1 1 int8
A Matlab ismeri még az int16, int32, int64 típusokat, amik rendre 2, 4, 8 bájtot foglalnak, illetve ezek előjelnélküli változatát, amit az u jelöl: uint8, ...
Mennyire kell kicsinek lennie?
intmax('int8')
ans = int8 127
Sztringek
s1='Ez egy sztring'
s1 = 'Ez egy sztring'
s2='ez egy Sztring'
s2 = 'ez egy Sztring'
s3='ez is az'
s3 = 'ez is az'
Nem működik a korábbi "=="-val összehasonlítás, mert a Matlab a sztringeket (szám)tömbként tárolja. Minden karakterhez tartozik egy ASCII-kód (kicsi egész szám), ezeket hasonlítja össze ilyenkor. Meg is lehet kérdezni:
double(s1)
ans = Columns 1 through 13 69 122 32 101 103 121 32 115 122 116 114 105 110 Column 14 103
Az ékezetes karakterekhez is tartozik kód
s4='Üvegvisszaváltó'
double(s4)
s4 = 'Üvegvisszaváltó' ans = Columns 1 through 13 220 118 101 103 118 105 115 115 122 97 118 225 108 Columns 14 through 15 116 243
Ha sztringekkel akarunk dolgozni, ahhoz külön hozzájuk írt függvények kellenek, például:
lower(s1)
ans = 'ez egy sztring'
Összehasonlítás, itt a == nem jó!
strcmp(s1,s2)
ans = logical 0
Nem veszi figyelembe a kis és nagybetűt:
strcmpi(s1,s2)
ans = logical 1
Összefűzés:
[s1 s2]
ans = 'Ez egy sztringez egy Sztring'
Konverzió:
s5='12'
a5=str2num(s5)
whos
s5 = '12' a5 = 12 Name Size Bytes Class Attributes a 1x1 8 double a5 1x1 8 double ans 1x28 56 char b 1x1 1 int8 c 1x1 1 int8 s1 1x14 28 char s2 1x14 28 char s3 1x8 16 char s4 1x15 30 char s5 1x2 4 char
A "cell" adattípus
Olyan tömbök tárolására alkalmas, melynek elemei különböző típusúak, erre a sima tömb nem képes
adatok=cell(2,3)
adatok = 2×3 cell array {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double}
kapcsos zárójelet kell használni az indexeléshez
adatok{1,1}='Ide'
adatok = 2×3 cell array {'Ide' } {0×0 double} {0×0 double} {0×0 double} {0×0 double} {0×0 double}
adatok{1,2}=12
adatok = 2×3 cell array {'Ide' } {[ 12]} {0×0 double} {0×0 double} {0×0 double} {0×0 double}
adatok{1,3}=[2 4 1]
adatok = 2×3 cell array {'Ide' } {[ 12]} {1×3 double} {0×0 double} {0×0 double} {0×0 double}
Vigyázat
adatok(1,3)
ans = 1×1 cell array {1×3 double}
nem ugyan az, például az adatok(1,3)=12 error ad
adatok{1,3}
ans = 2 4 1
Importálás Excel-ből
a .xls és .xslx formátumra működik, de kell a gépen feltelepített excel hozzá, különben korlátozottan működik
[szamok, szoveg, osszes]=xlsread('adatok.xls');
whos
Name Size Bytes Class Attributes a 1x1 8 double a5 1x1 8 double adatok 2x3 398 cell ans 1x3 24 double b 1x1 1 int8 c 1x1 1 int8 osszes 13x16 24882 cell s1 1x14 28 char s2 1x14 28 char s3 1x8 16 char s4 1x15 30 char s5 1x2 4 char szamok 13x15 1560 double szoveg 13x16 23562 cell
például ez nem működik nélküle
szam2=xlsread('adatok.xls', 'B2:E13');
Warning: Range cannot be used in 'basic' mode. The entire sheet will be loaded.
Feladatok
1.feladat: Készítsünk egy függvényt, aminek bemenete egy sztring a kimenete pedig a sztring elemeinek ascii-kódja+1 ('titkosírás'). Készítsük el a dekódoló függvényt is, amely az előbbi függvény kimenetéből visszaállítja a sztringet.
function v=kodol(s)
v=double(s)+1;
function s=dekodol(v)
s=char(v-1);
2. feladat: Nyissuk meg az 2015szept.xls nevű fájt, ebben időjárás adatok vannak az tavalyelőtt szeptemberről, Budapesten. A hőmérsékletadatok végén egy °C sztring van, emiatt a Matlab nem ismeri fel azokat számként. Vágjuk le ezt a végéről, majd ezután alakítsuk számmá a 2. és 3. oszlop adatait, majd az így kapott mátrix feldolgozásával állípítsuk meg, hogy
- melyik volt a leghidegebb nap,
[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 [ertek, hely]=min(minhomerseklet); fprintf('A leghidegebb nap szeptember %d. ekkor %d fok volt.\n',hely,ertek);
A leghidegebb nap szeptember 9. ekkor 3 fok volt.
- melyik volt az a nap, amikor a legnagyobb volt a hőmérékletingadozás?
maxhomerseklet=zeros(30,1); for i=2:31 maxhomerseklet(i-1)=str2num(szoveg{i,3}(1:end-2)); end [ertek, hely]=max(maxhomerseklet-minhomerseklet); fprintf('A legnagyobb hőingadozás szeptember %d.-n volt %d fok \n',hely, ertek);
A legnagyobb hőingadozás szeptember 9.-n volt 18 fok
- Mennyi volt a napi maximumhőmérsékletek átlaga?
mean(maxhomerseklet)
ans = 23.4000
- Ábrázoljuk a maximumhőmérséklet eloszlását hisztogrammon!
hist(maxhomerseklet)
![](labor07_01.png)