% % MATLAB alapozó % % 2009.12.16., Földváry Lóránt % 2014.01.29. Laky Piroska (kiegészítés)



Hasonló dokumentumok
1. Előadás Matlab lényeges vonásai,

3. Gyakorlat Ismerkedés a Java nyelvvel

A számok kiíratásának formátuma

1. Feladatlap. Függvények. Mőveletek Matlab nyelvben. Példa inverz osztásra >>d=2\1 d= Információkérési lehetıségek help utasítás

6. előadás. Matlab 1. (Ismerkedés, környezet, adattípusok) Dr. Szörényi Miklós, Dr. Kallós Gábor. Széchenyi István Egyetem

C# gyorstalpaló. Készítette: Major Péter

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

MATLAB alapismeretek II.

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei. Atomerőművek üzemtana

Informatika terméktervezőknek

BASH SCRIPT SHELL JEGYZETEK

Utasítások. Excel VII. Visual Basic programozás alapok. A Visual Basic-kel megoldható feladatok típusai Objektumok, változók Alprogramok

Atomerőművek üzemtanának fizikai alapjai. MATLAB használata

Alkalmazott modul: Programozás

INFORMATIKAI ALAPISMERETEK

Operációs Rendszerek II. labor. 2. alkalom

MATLAB. 3. gyakorlat. Mátrixműveletek, címzések

Internet programozása. 3. előadás

Bevezetés a C++ programozásba

INFORMATIKAI ALAPISMERETEK

A MATLAB alapjai. Kezdő lépések. Változók. Aktuális mappa Parancs ablak. Előzmények. Részei

Programozás alapjai. 5. előadás

7. Strukturált típusok

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

MATLAB alapismeretek III.

Megoldott feladatok. Informatika

D X F F Á J L K É S Z Í T É S E M A T L A B B A L

S z á m í t ó g é p e s a l a p i s m e r e t e k

A C# PROGRAMOZÁSI NYELV

MATLAB/OCTAVE/ ALAPOZÓ 1

Függvények ábrázolása

Készítette: Nagy Tibor István

Információs Technológia

INFORMATIKAI ALAPISMERETEK

Programozás II. Fájlkezelés

Közúti forgalommodellezési gyakorlatok

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás 5. Dr. Iványi Péter

Programozás III CSOMAGOK. Az összetartozó osztályok és interfészek egy csomagba (package) kerülnek.

Algoritmusok Tervezése. 1. Előadás MATLAB 1. Dr. Bécsi Tamás

Java II. I A Java programozási nyelv alapelemei

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

C# feladatgyűjtemény Kovács Emőd, Radványi Tibor, Király Roland, Hernyák Zoltán

Országzászlók (2015. május 27., Sz14)

INFORMATIKAI ALAPISMERETEK

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Bevezetés a C++ programozási nyelvbe

Készítette:

Apple Swift kurzus 3. gyakorlat

E- Laboratórium 3 Az ABB robotok alkalmazásai Elméleti leírás

Mérnöki programozás 8. Szerkesztette: dr. Vass Péter Tamás

Példa: Aktuális könyvtár tartalmának fájlba mentése, melynek neve az aktuális dátum és idő: ls l > `date+%f_%h-%m`.txt

117. AA Megoldó Alfréd AA 117.

Suzuki alkatrész árlista import

C# feladatok gyűjteménye

Matlab alapok. Baran Ágnes

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar


Programozás 3. Dr. Iványi Péter

LEKÉRDEZÉSEK SQL-BEN. A relációs algebra A SELECT utasítás Összesítés és csoportosítás Speciális feltételek

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

Alap számológép alkalmazás

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Matematikai programok

Adatbázis-kezelés. Harmadik előadás

Feladat: Hogyan tudunk létrehozni egy olyan vector nevű tömb típust, amely egy háromdimenziós térbeli vektort reprezentál?

1. Alapok. #!/bin/bash

KR TITKOSÍTÓ PROGRAM. Felhasználói leírás. v március 12.

Smalltalk 2. Készítette: Szabó Éva

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

1. fejezet Microsoft Excel 2010 Tartománynevek... 3

M4 TÁBLÁZATKEZELÉS ALAPJAI

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Matematikai programok

Valószínűség-számítás II.

Információs Technológia

Körkörös listák. fej. utolsó. utolsó. fej

Feladat Nézzük meg a súgóban (help és doc) a sin parancs használatáról olvasható információt! Próbáljuk ki a kirajzoltató utasítást.

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Halmazelmélet alapfogalmai

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

1. Három tanuló reggel az iskola bejáratánál hányféle sorrendben lépheti át a küszöböt?

NONPROFIT ÉRDEKVÉDELMI SZERVEZETEK FEJLESZTÉSE (PL.3346) Java-script nyelv. programozás alapjai. Haramia László

Szkriptnyelvek. 1. UNIX shell

Programozás II. 2. Dr. Iványi Péter

C változók. Feladat: Deklaralj egy valos, egy karakter es ket egesz tipusu valtozot! int main() {

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Matematikai és matematikai statisztikai alapismeretek

S z á m í t ó g é p e s a l a p i s m e r e t e k

Operációs Rendszerek példatár. Utolsó frissítés: február 10.

ADATBÁZISKEZELÉS ADATBÁZIS

BEKÉRT ADAT KÉPERNYŐRE ÍRÁSA KÖRNYEZETI VÁLTOZÓK FÁJL REDEZETT KIÍRÁSA KÖNYVTÁRBAN BEJEGYZÉSEK SZÁMA FÁJLBAN SZÁM NÖVELÉSE. #!

HÁZI FELADAT ELSŐ GYAKORLAT MIELŐTT ELKEZDENÉNK ELINDULÁS. ÜZLETI INFORMATIKAI ESZKÖZÖK Kiadványszerkesztés

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Dr. Pétery Kristóf: Excel 2007 feladatok és megoldások 2.

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Számítástechnika labor feladatok a 2012/2013. tanév őszi félévében

Adatok szűrése, rendezése

Digitális terepmodell modul

Átírás:

% % 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