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

[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.
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 
mean(maxhomerseklet)
ans =

   23.4000

hist(maxhomerseklet)