MATLAB 3. gyakorlat Mátrixműveletek, címzések
Menetrend Kis ZH Mátrixok, alapműveletek Vezérlő szerkezetek Virtuális műtét Statisztikai adatok vizsgálata
pdf Kis ZH
Mátrixok, alapműveletek mátrix létrehozása, transzponált, összefűzés, indexelés (skalárral, egész vagy logikai vektorral, lineárisan), length, size, ones, zeros, rand, diag, eye, squeeze, reshape find, beépített fv.-ek mátrixokon (sin, abs, exp, round, stb.), logikai műveletek és indexelés (pl. A<1.2, B~=3), sum, prod, mean, min, max, trace, elemenkénti műveletvégzés (A.*B, A.^2, stb.)
Példa 1 1. Hozzunk létre egy 3-dimenziós véletlen mátrixot, dimenziónként 5, 2 és 3 elemmel. 2. Két különálló változóba mentsük el ennek a 2. dimenzió mentén található két részmátrixát. 3. Számítsuk ki az első részmátrixban a sorok maximumainak összegét. 4. Számítsuk ki a második részmátrixban az oszlopok minimumainak négyzetes átalág.
Megoldás 1 % 3-dimenziós véletlen mátrix létrehozása R = rand(5,2,3); % részmátrixok kiválasztása resz1 = squeeze(r(:,1,:)); resz2 = squeeze(r(:,2,:)); % resz1-ben a sorok maximumainak összege maxossz = sum(max(resz1,[],2)); % resz2-ben az oszlopok minimumainak négyzetes átlaga min2atlag = sqrt(mean(min(resz2).^2));
Példa 2 Legyen MERES = 10+25*rand(5,3) egy olyan mátrix, amely 5 db hőmérséklet szenzor mérési eredményeit tartalmazza C-ban (szenzor X mérésszám formában). A szenzorokról tudjuk, hogy 15 C és 30 C közötti tartományra lettek kalibrálva, ezért az ezen a tartományon kívül mért értékeket hibásnak tekintjük. 1. Adjuk meg minden egyes szenzorra, hogy a három mérésből hány volt hibás! 2. Adjuk meg azoknak a szenzoroknak a sorszámát, amelyek legalább kétszer jó értéket mértek!
Megoldás 2 % mért értékek MERES = 10+25*rand(5,3); % mérési hibahatárok definiálása also_hibahatar = 15; felso_hibahatar = 30; % hibás értékek jelölése (felülírhatók az elemek, hiszen hibásak) MERES((MERES < also_hibahatar) (MERES > felso_hibahatar)) = 0; % szenzoronként vett hibás mérések száma szenzor_hibaszam = sum(meres == 0, 2); % legalább 2 jó méréssel rendelkező szenzorok sorszámai jo_szenzorok = find(szenzor_hibaszam < 2);
Példa 3 1. Hozzunk létre a 0 1 intervallumon 0.01-es felbontással egy olyan 3 Hz-es szinusz jelet, melynek amplitúdója az idővel egyenes arányban változik! 2. Módosítsuk a kapott jelalakot úgy, hogy a -0.2-nél kisebb elemek helyére -0.2-t, a 0.5-nél nagyobb elemek helyére pedig 0.5-öt írunk! 3.Rajzoljuk ki mindkét görbét egy közös ábrára, a 0 szintet is jelölve egy fekete szaggatott vonallal. Az ábrát megfelelően feliratozzuk!
Megoldás 3 % a szinuszjel frekvenciája Fsin = 3; % idővektor t = 0:0.01:1; % a függvény értékeinek kiszámítása fv = t.*sin(2*pi*fsin*t); % az értékek módosítása új változóban fv_mod = fv; fv_mod(fv_mod < -0.2) = -0.2; fv_mod(fv_mod > 0.5) = 0.5; % kirajzolás figure(1); clf; hold on; plot(t,fv,'--','linewidth',3); plot(t,fv_mod,'r'); plot([t(1) t(end)],[0 0],'k--'); xlim([t(1) t(end)]); title('gorbe ertekeinek modositasa'); xlabel('ido (s)'); ylabel('fuggvenyertek'); legend('eredeti','modositott');
Megoldás 3
Vezérlő szerkezetek - elágazás IF ELSE ELSEIF if feltétel parancsok end if feltétel parancsok1 else parancsok2 end Nincs zárójelezés, az adott blokk végét az end jelzi. if feltétel1 parancsok1 elseif feltétel2 parancsok2 else parancsok3 end A feltétel logikai értékét vizsgálja (ami nem 0, az igaz). Relációs operátorok (==, ~=, <, >, <=, >=) Logikai operátorok (&, &&,,, ~, xor, all, any)
Vezérlő szerkezetek - ciklusok FOR for n = 1:10 parancsok end Ismert számú iteráció elvégzésére. Nincs zárójelezés, az adott blokk végét az end jelzi. A ciklusváltozót sorvektorként definiáljuk, a ciklus törzsében értéke az aktuális elemnek megfelelő skalár. A ciklusváltozó tetszőleges sorvektor lehet (pl. [1 3 7 5 6]). WHILE while feltétel parancsok end Ismeretlen számú iteráció elvégzésére egy feltétel teljesüléséig. Nincs zárójelezés, az adott blokk végét az end jelzi. Nincs explicit módon megadott ciklusváltozó. Figyeljünk a végtelen ciklus elkerülésére!
Vezérlő szerkezetek - switch SWITCH in = input('írj be egy számot: '); switch in case 0 disp('nullát írtál be.'); case 1 megoldas = 2*pi*exp(3.2); case {2, 5} disp('a bemenet 2 vagy 5.'); otherwise disp('nem jó értéket adtál meg, próbáld újra...'); end
Virtuális műtét A load parancs használatával töltsük be az anat.mat fájlt. Nézzük meg, hogy mit tartalmaz az anat változó 3. dimenzió szerint vett 150. szelete. (imagesc, colormap gray) Nézzük végig az anat változó összes szeletét a 3. dimenzió mentén. Ehhez írjunk egy for ciklust, amiben végiglépkedünk a szeleteken és megjelenítjük azokat.
Virtuális műtét % adatok betöltése load anat; % egy szelet megjelenítése szelet = anat(:,:,150); figure(1); imagesc(szelet); colormap gray; % adatok betöltése load anat; % az összes szelet megjelenítése figure(2) colormap gray; for ind = 1:size(anat,3) szelet = anat(:,:,ind); imagesc(szelet); pause(0.02) end
Virtuális műtét A [260, 215, 130] koordináták környékén epileptogén területet találtak az orvosok. Nem lehet gyógyszeresen kezelni, meg kell műteni. A műtét megtervezéséhez jelenítsük meg a célterületet a kiadott showslices függvény használatával. Szimuláljuk le a műtétet a megadott pont körüli 9 voxel élű kocka kivágásával. Ehhez egyrészt mentsük el egy változóba a kivágni kívánt részt, másrészt nullázzuk ki az eredeti mátrixban a vonatkozó térfogatot. Jelenítsük meg az eredményt.
Virtuális műtét % célterület coords=[260,215,130]; % megjelenítés showslices(anat,coords); % a kivágni kívánt térfogat koordinátái vagas_x = coords(1)-4:coords(1)+4; vagas_y = coords(2)-4:coords(2)+4; vagas_z = coords(3)-4:coords(3)+4; % kivágott rész külön mátrixban (3D) kivagott = anat(vagas_x,vagas_y,vagas_z); % "vágás" a teljes térfogatból anat_vagott = anat; anat_vagott(vagas_x,vagas_y,vagas_z) = 0; % megjelenítés showslices(anat_vagott,coords); showslices(kivagott,[1 1 1]);
Virtuális műtét Számítsuk ki, hogy a szimulált műtét eredményeként szürke- és fehérállományának hány %-át veszítené el a beteg. Ehhez: a háttér eltávolítása után vizsgáljuk meg az eredeti térfogat értékeinek eloszlását (hist, 100 részes), és állapítsunk meg egy jó vágási határt a szürke- és fehérállomány szétválasztásához tároljuk el külön változókban a kivágott és az eredeti térfogatok szürke- és fehérállományainak elemszámait, majd számítsuk ki a kivágott szürke- és fehérállomány %-os arányát az egészhez képest
Virtuális műtét % háttér eltávolítása anat_nincshatter = anat(anat>0); % értékek eloszlása hisztogrammal figure; hist(anat_nincshatter,100); % a hisztogram alapján hatar = 0.8; % szürke- és fehérállományok elemszámainak eltárolása szurke_teljes = sum(anat_nincshatter < hatar); feher_teljes = sum(anat_nincshatter > hatar); szurke_kivagott = sum(kivagott(:) < hatar); feher_kivagott = sum(kivagott(:) > hatar); % százalékos arányok megadása szurke_szazalek = szurke_kivagott/szurke_teljes*100; feher_szazalek = feher_kivagott/feher_teljes*100;
Statisztikai adatok vizsgálata A load parancs használatával töltsük be a nepesseg.mat fájlt. Mátrixműveletek segítségével végezzük el a következőket: 1.Adjuk meg, hogy Magyarországon mekkora volt az átlagos népesség a vizsgált időszakban (2000-2012)! 2.Adjuk meg, hogy a 2002-es adatokhoz képest hány százalékkal változott Dánia népessége 2010-re! 3.Adjuk meg, hogy a Magyarország és Németország népessége közötti különbség hányszorosa volt Finnország teljes népességének 2007-ben!
Statisztikai adatok vizsgálata 4.Kiderült, hogy a Belgiumra vonatkozó adatok 2003 és 2006 között (ezeket is beleértve) fordított sorrendben kerültek a táblázatba. Javítsuk ki a hibát! 5.Kiderült továbbá, hogy a 2009-es és 2010-es adatok minden országra fel lettek cserélve. Javítsuk ki a hibát! 6.Közös ábrán rajzoljuk ki Magyarország, Ausztria és Görögország népességének alakulását a teljes vizsgált időszakban! Az ábrát megfelelően feliratozzuk!
Statisztikai adatok vizsgálata load nepesseg.mat; % 1 Magyar_atlag = mean(adatok(end,:)); % 2 Dania_valt_2002_2010 = adatok(4,evek == 2010) / adatok(4,evek == 2002); % 3 mikor = evek == 2007; MagyarNemet_kul_2007 = abs(adatok(10,mikor)-adatok(8,mikor))/adatok(6,mikor); % 4 tartomany = find(evek == 2003):find(evek == 2006); Belgium_rossz = adatok(2,tartomany); adatok_jav = adatok; adatok_jav(2,tartomany) = Belgium_rossz(end:-1:1);
Statisztikai adatok vizsgálata % 5 adat2009 = adatok(:,evek == 2009); adatok_jav2 = adatok_jav; adatok_jav2(:,evek == 2009) = adatok_jav2(:,evek == 2010); adatok_jav2(:,evek == 2010) = adat2009; % 6 Magyar_nepesseg = adatok_jav2(10,:); Osztrak_nepesseg = adatok_jav2(1,:); Gorog_nepesseg = adatok_jav2(9,:); figure(1); hold on; plot(evek,magyar_nepesseg,'go--'); plot(evek,osztrak_nepesseg,'ro--'); plot(evek,gorog_nepesseg,'bo--'); title('népességszám alakulása (2000-2012)'); xlabel('év'); ylabel('fő'); legend('magyarország','ausztria','görögország');