% % MATLAB alapozó % % 2009.12.16., Földváry Lóránt % 2014.01.29. Laky Piroska (kiegészítés) %% mindennek a kulcsa: help és a lookfor utasítás (+doc) % MATLAB alatt help % help topics - témakörök help elfun % elementary functions - alapfüggvények help ops % operators and special characters - műveletek, speciális karakterek lookfor inverse % megkeresi azokat a parancsokat, aminek a helpjében szerepel % az inverz szó % a parancs megszakítható a CTRL+C billentyűkombinációval lookfor determinant doc help % a doc parancs részletesebb leírását adja a parancsoknak % Octave alatt csak a help+parancsnév működik (elfun, ops nem), illetve a % doc és a lookfor parancs, de nyugodtan nézhetjük az Octave helpje mellett a % MATLAB online helpjét is, részletesebb leírásokért %% szám felírási módok 0.01 1e-2 1d-2 exp(1) % e=2.7183 pi % 3.1416 % számok megjelenítése format long 0.01 % 0.010000000000000 format short 0.01 % 0.0100 % sor végén pontos vessző: a végrehajtott utasítás eredménye NEM jelenik % meg a képernyőn. 0.01; a=0.01; % a változóneveknek betűvel kell kezdődniük (később már lehet bennük szám) % ugyanígy a MATLAB.m fájlok neve sem kezdődhet számmal, és ékezetes betűk % sem lehetnek benne, se az őket tartalmazó könyvtárnévben % képernyő és a változók törlése clc % törli a Command Window tartalmát clear all % törli az összes korábbi változót % korábbi parancsok visszahívhatóak a fel, le nyilakkal a parancssorban % TAB-bal kiegészíthetőek megkezdett parancsok pl. len+tab->length %% Vektorok, mátrixok % vektor megadás % sor vektor vs=[1 2 3 4 5 6]; % szóközzel vagy vesszővel elválasztva % oszlop vektor vo=[1; 2; 3; 4; 5; 6; 7]; % mátrix megadás M=[1 2 3; 4 5 6; 7 8 9]; 1
% mátrix/vektor méretének megtekintése size(m) size(vs) size(vo) % változóba mentése [p,q]=size(m); % mátrix/vektor "hossza": a maximális mérete length(m) length(vs) length(vo) % mátrix valahányadik sora M(2,:) M(2,1:) % mátrix valahányadik oszlopa M(:,3) % mátrix valamelyik eleme M(2,3) % mátrix valamelyik részhalmaza M(2,2:3) M(1:2,2:3) % mátrix többszöri egymás mellé illesztése MM=repmat(M,1,3) % 1 sorba 3-szor egymás mellé % mátrix/vektor transzponáltja vs size(vs) vs' size(vs') % M M' % mátrix főátlója diag(m) % vektorból képzett diagonális mátrix diag(vs) % mátrix determinánsa det(m) % mátrix inverze inv(m) % Hiba üzenet: a mátrix szinguláris vagy rosszul kondicionált % Az eremények lehet, hogy rosszak % Ha zavarnak a hibaüzenetek: % warning off K=[3 7 2; 4 9 1; 4 4 7]; L=[2 4 5; 6 9 2; 3 8 5]; % Mátirxok összefűzése KL1 = [K L] KL2 = [K;L] % elemi műveletek mátrixokkal O=K+L; 2
O=K-L; O=K*L; O=K/L; % K*inv(L) O=K\L; % inv(k)*l % elemi műveletek számokkal % egy index-szel kiválasztott mátrix elem egy szám sz1=vo(4) sz2=k(2,3) sz1+sz2 sz1-sz2 sz1*sz2 sz1/sz2 sz1\sz2 % sz2/sz1 % elemi műveletek számsorokkal vp=[4; 4; 2; 6; 0; -2; 5]; vo+vp vo+vp' % Hibaüzenet: a mátrix dimenziók nem egyeznek vo*vp % Hibaüzenet: a mátrix dimenziók nem egyeznek vo.*vp % elemenkénti szorzás vo./vp % Inf: végtelen szám vo.^2 % vektort elemenként négyzetre emel % A. nagyon fontos bármilyen függvény írásakor, amit szeretnénk, hogy ne % csak skalárokkal, hanem vektorokkal is működjön *,/,^ előtt:.*,./,.^!!! % elemi művetelek tenzorokkal K+L K-L K.*L % elemenkénti szorzás % K*L % mátrix szorzás K./L % elemenkénti osztás % K/L % K*inv(L) % konstans hozzáadása minden egyes elemhez K K-1 L./(K-1) % konstans hozzáadása egy elemhez O=K; O(3,2)=O(3,2)+2 %% logikai műveletek vp(4) % egyenlő (==), nem egyenlő (~=) vp(4)==5 % 0, mert nem egyenlő vp(4)==6 % 1, mert egyenlő vp(4)~=6 % 0, mert egyenlő vp(4)~=5 % 1, mert nem egyenlő % kisebb, nagyobb vp(4)>5 % 1, mert nagyobb vp(4)>=7 % 0, mert nem nagyobb, és nem is egyenlő vp(4)>=6 % 1, mert nem nagyobb, de egyenlő vp(4)~>6 % Hibaüzenet: nincs "nem nagyobb" vagy "nem kisebb" művelet % or vp(3) % 2 vp(4) % 6 vp(3)==5 vp(4)==6 % 1, mert az egyik feltétel igaz 3
% and vp(3)==5&&vp(4)==6 % 0, mert csak az egyik feltétel igaz % matrixok elemenkénti vizsgálata: or- and-& %% elemek keresése % adott értékű elemek kiválasztása K K==7 find(k==7) [ind1,ind2]=find(k==7) % az index vektorokban lévő elemek megtekintése K(ind1,ind2) % Hát ez bizony nem az, amit szerenénk... K(ind1(1),ind2(1)) K(ind1(2),ind2(2)) %% ciklus műveletek % 1. "for" ciklus % A fenti ind1 és ind2 vektorokhoz tartozó K mátrix elemek megjelenítése for i=1:length(ind1) i K(ind1(i),ind2(i)) % string változók összefűzése x='boci boci' y=' tarka' s=[x y] z='se füle se farka' xyz=[s;z] % hibaüzenet MATLAB-ban, - nem egyforma hosszúságúak a sorok % Octave-ban működik, szóközökkel tölti fel a helyeket % A változók string változóvá alakítása: num2str for i=1:10 ['A ciklus a(z) ' num2str(i) '. elemnél tart'] % Adekvát megjelenítés: disp disp(3) % az output számként értelmezett disp('3') % az output stringként értelmezett for i=1:10 disp(['a ciklus a(z) ' num2str(i) '. elemnél tart']) % A string változó utasításszerű végrehajtása: eval disp(['3+2']) eval(['3+2']) eval(['out=3+2;']) disp(out) % ezekre egy példa az ind1 és ind2 vektorok felhasználásával for i=1:2 % változók szerinti ciklus (ind1 és ind2) for j=1:length(ind1) % változók hossza szerinti ciklus disp(['ind' num2str(i) '(' num2str(j) ')']) eval(['ind' num2str(i) '(' num2str(j) ')']) 4
% for j=1:length(ind1) disp(['k(ind1(' num2str(j) '),ind2(' num2str(j) '));']) eval(['k(ind1(' num2str(j) '),ind2(' num2str(j) '))']) % 2. "while" i=0; while i<20; i=i+1; disp(i) % számok 0-20-ig % i=0; while i<=20; i=i+1; disp(i) % számok 0-21-ig % rand - egyenletes eloszlású random szám generátor [0,1] intervallumban rand(1) % 1x1 rand(3) % 3x3 rand(3,1) % 3x1 % randn-normális eloszlású random szám generátor, 0-várható érték,1-szórás randn(3) % Ciklus, amíg 0.9-nél kisebb számokat kapunk r=0;i=0; while r<0.9 r=rand(1); disp(r) i=i+1; disp(i) % ciklus, amíg közelítőleg 0 determinánsú mátrixot nem kapunk (<0.01) i=rand(4); disp(i); disp(det(i)); j=1; while abs(det(i))>1e-2 disp(['ez a(z) ' num2str(j) '. ciklus']) i=rand(4); disp(i); disp(det(i)); j=j+1; %% Kerekítések i=100*rand(1); disp(i) disp(round(i)) % matematikai kerekítés a legközelebbi egészre disp(ceil(i)) % felfelé kerekít 5
disp(floor(i)) % lefelé kerekít disp(fix(i)) % 0 felé kerekít a legközelebbi egészre % mínusz számokra disp(round(-i)) % legközelebbi egész felé disp(ceil(-i)) % felfelé disp(floor(-i)) % lefelé disp(fix(-i)) % nulla felé %% Feltételi műveletek % "if" i=100*rand(1); disp(i) if i>=70; disp(['halihó!']) elseif i<70&&i>=40; disp(['hull a hó!']) elseif (i<10) (i<40&&i>20) disp(['télapó!']) else disp(['gestapo!']) % switch (case - otherwise) jegy=ceil(rand(1)*5) switch jegy case 5 disp('kiváló!') case 4 disp('jó') case 3 disp('közepes') case 2 disp('elégséges') otherwise disp('elégtelen') % A menu parancs MATLAB-ban egy grafikus ablakot jelenít meg választási % lehetőségekkel, Octave-ban szövegesen írja ki a választási lehetőségeket a % képernyőre, Octave-ben a listdlg-t lehet használni grafikus ablakhoz, ha van % java csomag telepítve pizza=menu('válassz egy pizzát!','sajtos', 'Sonkás', 'Gombás'); switch pizza case 1 disp('sajtos pizza relés') case 2 disp('sonkás pizza relés') case 3 disp('gombás pizza relés') otherwise disp('nincs pizza relés') %% megjelenítések x=0:3:297; % 0-297-ig 3-asával a számok (100 db) 6
a=rand(100,1); b=rand(100,1); figure; plot(a); title('random generált sor') % sorr: abcissza, ordináta figure; plot(x,a); title('random generált sor - abcisszával ellátva'); xlabel('abcissza'); ylabel('ordináta') % vonaltípusok: '-',':','-.','--' (folytonos, pontozott,pont-vonal,szaggatott) % színek: b,g,r,c,m,y,k,w - kék,zöld,piros,cián,magenta,sárga,fekete,fehér figure; plot(x,a,'k:'); title('random generált sor - abcisszával ellátva'); xlabel('abcissza'); ylabel('ordináta') % hold on: a meglévő információ megtartása végett % leg: vonaltípusokhoz rel megnevezést figure; plot(a,'r'); hold on; plot(b,'b') title('random generált sorok'); leg('a','b','location','best') % szimbólumok (van egy csomó, lásd "help plot") figure; plot(a,'m*'); hold on; plot(b,'ch') title('random generált sorok'); leg('a','b','best') % 1 "hold on" elég figure; plot(a,'m*'); hold on; plot(b,'ch'); plot(a,'k-'); plot(b,'r-'); title('random generált sorok'); leg('a','b') hold off; % 3D megjelenítés figure(1);plot3(x,a,b,'r*'); xlabel('x'); ylabel('a');zlabel('b') % aktuális forgatási mátrix lekérdezése out=view % aktuális Hz forgatás és V magasság lekérdezése [az,el]=view % view alkalmazása view(2); % az=0, el=90 view(3); % az=-37.5, el=30 view(out); % tetszőleges forgatási mátrix view([az,el]) % % Polárkoordinátás megjelenítés t = 0:0.01:2*pi; % szögek 0-tól 2pi-ig r = abs(sin(2*t).*cos(2*t)); % távolságok a szög függvényeként % MIvel t vektor, fontos a.* műveletnél a. használata!!! figure(2); polar(t, abs(sin(2*t).*cos(2*t))); title('abs(sin(2t)*cos(2t))'); %% Input/output a képernyőről/re nev=input('add meg a neved: ') % Hibaüzenet, ha nem nincs idézőjel '...' nev=input('add meg a neved: ','s') % Ha szöveges választ várunk r=input('add meg a kör sugarát: ') 7
T=pi*r*r; disp(['a kör területe: ' num2str(t)]) fprintf('a kör területe: %.2f\n',T) % formázott megjelenítés, 2 tizedesre, képernyőre utca='street'; fprintf('angolul a %s rövidítése %.2s.\n',utca,utca); % első két betű % konverziós karakterek: f-lebegőpontos szám, d-egész szám, s-string % \n - sorvége jel %% Műveletek stringekkel a = 'teodolit'; b = 'szintező'; c = 'libella'; length(a) bc = [b c] % más megoldás: strcat(b,c) ab = [a; b] % más megoldás: strvcat(a,b) size(ab) % 2x8 ac = [a; c] % hiba, nem egyforma hosszú stringek! ac = strvcat(a,c) % kitölti szóközökkel az üres helyeket % másik megoldás: char(a,c), ez is kitölti szóközökkel az üres helyeket char(a,c) a(1:3) ab(1:2,1:5) char(97) % 'a' betű ASCII kódja 97 char(36) s1 = sprintf('a pi értéke: %.4f',pi) % fprintf-hez hasonlóan lehet formázott szöveget megadni, de az sprintf egy % stringbe teszi az eredmény, nem csak a képernyőre írja ki! user = input('add meg a neved: ','s'); s2 = sprintf('%s, add meg az azonosítódat: ',user); id = input(s2); bl = blanks(4) % 4 szóközből álló string length(bl) % 4 nevek = char('mira', 'Dominik', 'István') nev1 = nevek(1,:) %Mira length(nev1) nev1 = deblank(nev1) % üres helyek levágása a szó végéről length(nev1) % strtrim - szó eleji és szó végi szóközök levágása s = Az élet nem habostorta! ; s2 = strsplit(s) % a szóközöknél szétszedi a stringet % Octave-ban működik, Matlab-ban csak a 2013-as verziótól kezdve % Meg lehet adni elválasztó karaktert a szóköz helyett pl. strsplit(s, ; ) s = 'Üdvözöljük a második MATLAB órán!'; [s1 s2] = strtok(s) % két részre vágja az első szóköznél a stringet % meg lehet adni más elválasztó karaktert is 8
[s1 s2] = strtok(s,'m') s2 = strrep(s,'matlab','geodézia') % csere MATLAB -> geodézia strcmp(s,s2) % összehasonlíja a két stringet, ha nem egyezik, eredménye 0 % strcmpi ua. mint előbb, de nem számít a kis/nagy betű % keresés findstr(s,'matlab') % 22. karakternél kezdődik a MATLAB szó findstr(s,'geodézia') % [] nincs eredmény str = num2str(pi) % számot szöveggé alakít num = str2num('123.456') % szöveget számmá alakít %% Saját függvények készítése % Függvény fejléce: % function [out1, out2,...] = funname(in1, in2,...) % a függvény neve (funname) ugyanaz kell, hogy legyen, mint az m file neve! kor.m: function [ter ker]=kor(r) % A 'kor' függvény kiszámolja a megadott sugarú kör területét, kerületét % Függvény hívása: kor(r) ter = pi*r*r; ker = 2*r*pi; [t k] = kor(5) % t=78.5398, k=31.4159 help kor szulinap.m function szulinap(nev,kor) % A 'szulinap' függvény felköszönti a szülinapost % Függvény hívás: szulinap(nev,kor) % nev - string, kor - egész fprintf('boldog %d. születésnapot %s!\n',kor,nev); help szulinap szulinap('laci',3) %Boldog 3. születésnapot Laci! % Moduláris programozás, függvényekkel, szubfüggvényekkel % Téglalap terület számítás teglalap.m: function teglalap [hossz, szel] = beolvas; megjelenit(hossz, szel) function [a,b] = beolvas a = input('add meg a téglalap szélességet: '); b = input('add meg a téglalap hosszát: '); function megjelenit(a,b) ter=a*b; 9
fprintf('egy %.2f m széles, %.2f m hosszú téglalap területe: %.2f m^2\n',a,b,ter) %% Cellatömbök, struktúrák % Celatömbökbe különböző típusú adatokat, különböző hosszúságú stringeket % tárolhatunk, kapcsos zárójel használatával cella = {23,'kispista',1:3:15,'julcsi'} % cella = [23] 'kispista' [1x5 double] 'julcsi' cella{1} % 23 cella{3} % 1 4 7 10 13 cella{3}(2) % 4 cellamatrix = {45, 'a'; 1:5:100, 'Hello'} % cellamatrix = % [ 45] 'a' % [1x20 double] 'Hello' cellamatrix{2,2} % Hello cellamatrix{2,1}(3) % 11 % Struktúrák % Egy adott struktúrában különböző mezők szerint rezett adatok szemely=struct('nev','pista','kor',23,'tel','06701234567','varos','budapest') % szemely = % nev: 'Pista' % kor: 23 % tel: '06701234567' % varos: 'Budapest' szemely.nev='csilla' % szemely = % nev: 'Csilla' % kor: 23 % tel: '06701234567' % varos: 'Budapest' % Struktúra vektor emberek(1)=struct('nev','pista','kor',23,'tel','06701234567','varos','budapest '); emberek(2)=struct('nev','csilla','kor',19,'tel','06301234567','varos','budapes t'); emberek(3)=struct('nev','juliska','kor',35,'tel','06201234567','varos','budape st'); emberek % emberek = % 1x3 struct array with fields: % nev % kor % tel % varos emberek(2).nev % Csilla struct2cell(szemely) 10