Difference between revisions of "Matlab/Octave"

From RoboWiki
Jump to: navigation, search
(Matice, vektory, skaláry)
(Literatúra)
 
(17 intermediate revisions by the same user not shown)
Line 22: Line 22:
  
 
  octave:1> 2 + 3
 
  octave:1> 2 + 3
  ans = 4
+
  ans = 5
 
  octave:2> cos(pi)
 
  octave:2> cos(pi)
 
  ans = -1
 
  ans = -1
Line 49: Line 49:
  
 
Reťazce môžeme uzatvárať do úvodzoviek, alebo apostrofov. Druhý spôsob tu nebudeme používať,
 
Reťazce môžeme uzatvárať do úvodzoviek, alebo apostrofov. Druhý spôsob tu nebudeme používať,
pretože sa nepáči wiki.
+
pretože apostrof sa používa aj na transpozíciu a okrem toho sa nepáči ani tejto wiki.
  
 
  octave:7> napis = "Ahoj Peter!";
 
  octave:7> napis = "Ahoj Peter!";
Line 62: Line 62:
 
existuje help, ktorý sa vyvolá <TT>help príkaz</TT>.
 
existuje help, ktorý sa vyvolá <TT>help príkaz</TT>.
  
=== Matice, vektory, skaláry ===
+
== Matice, vektory, skaláry ==
  
 
V Matlabe/Octave je všetko matica. Vektor je špeciálny prípad matice s jedným riadkom/stĺpcom,  
 
V Matlabe/Octave je všetko matica. Vektor je špeciálny prípad matice s jedným riadkom/stĺpcom,  
Line 115: Line 115:
 
   
 
   
  
 +
== Základné operátory ==
  
  
==== Základné operátory ====
+
+    Súčet
 +
-    Rozdiel
 +
*    Súčin
 +
/    Podiel
 +
^    Mocnina
 +
'    Komplexne združená transpozícia
 +
.*  Súčin po prvkoch vektora/matice
 +
./  Podiel po prvkoch
 +
.^  Umocnenie po prvkoch
 +
.'  Nekonjugovaná transpozícia
  
  
+ Súčet
+
== Operátor dvojbodka ==
- Rozdiel
 
* Súčin
 
/ Podiel
 
^ Mocnina
 
' Komplexne združená transpozícia
 
.* Súčin po prvkoch vektora/matice
 
./ Podiel po prvkoch
 
.^ Umocnenie po prvkoch
 
.' Nekonjugovaná transpozícia
 
  
 +
Toto je veľmi mocný nástroj. Dá sa použiť napríklad pre vytvorenie postupnosti čísel
 +
buď s krokom 1, alebo s definovaným krokom
  
 +
octave.exe:40> n = 5;
 +
octave.exe:41> A = 1:n
 +
A =
 +
 +
  1  2  3  4  5
 +
 +
octave.exe:42> A = 1:0.3:n
 +
A =
 +
 +
  Columns 1 through 8:
 +
 +
    1.0000  1.3000  1.6000  1.9000  2.2000  2.5000  2.8000  3.1000
 +
 +
  Columns 9 through 14:
 +
 +
    3.4000  3.7000  4.0000  4.3000  4.6000  4.9000
  
Shortcuts
+
== Prístup k prvkom matice ==
• You can create an array of integers 1..n by:
 
A = [ 1:n ]
 
• You can change the step size by:
 
A = [ 1:0.1:n ]
 
  
Indexing and slicing
+
Pre jednotlivé prvky použijeme indexy v okrúhlych zátvorkách
  
     * v(k) is the $ k$-th element of the row or column vector $ v$.
+
octave.exe:44> A = [ 0 1 2; 3 4 5 ; 6 7 8 ]
     * A(k,l) is the matrix element $ a_{kl}$.
+
A =
    * v(m:n) is the ``slice'' of the vector $ v$ from its $ m$th to its $ n$-th entry.
+
    * A(k,:) is the $ k$th row of matrix $ A$.
+
     0  1  2
     * A(:,l) is the $ l$th column of matrix $ A$.
+
    3  4  5
 +
     6  7  8
 +
 +
octave.exe:46> A(1,3)
 +
ans =  2
 +
octave.exe:48> A(2,:)
 +
ans =
 +
 +
     3  4  5
 +
 +
octave.exe:49> A(1:2,1:2)
 +
ans =
 +
 +
    0  1
 +
    3  4
 +
  
Querying dimensions:
+
== Základné príkazy pre matice ==
  
    * length(v) returns the number of elements of the vector $ v$.
+
* <TT>length(v)</TT> počet prvkov vektora '''v'''
    * [Rows,Columns] = size(A) returns the number of rows and columns of the matrix $ A$.
+
* <TT>[Rows,Columns] = size(A)</TT> počet riadkov a stĺpcov matice '''A'''
 +
* <TT>det(A)</TT>  determinant matice '''A'''
 +
* <TT>inv(A)</TT>  inverzná matica k '''A'''
 +
* <TT>A'</TT> transponovaná matica
 +
* <TT>rank(A)</TT> hodnosť matice '''A''' (počet lineárne nezávislých riadkov alebo stĺpcov)
 +
*
 +
* <TT>eye(n)</TT> vytvorí jednotkovú maticu rozmeru n x n
 +
* <TT>zeros(n,m)</TT> vytvorí nulovú maticu rozmerov n x m
 +
* <TT>ones(n,m)</TT> vytvorí maticu zo samých 1 rozmerov n x m
  
Accessing elements of a vector and array
+
== Riadiace príkazy ==
a = [1, 2; 3, 4];
 
a(1, 2)
 
ans =
 
2
 
• Accessing rows/columns of a vector and array
 
a = [1, 2, 3; 4, 5, 6];
 
a(1,:)
 
ans =
 
1 2 3
 
Accessing arrays
 
  
Accessing a submatrix of an array
+
Ako každý poriadny programovací jazyk, aj tento má testy '''if''' a '''case''' a cykly '''while''' a '''for'''
a = [1, 2, 3; 4, 5, 6; 7, 8, 9];
 
a(1:2, 1:2)
 
ans =
 
1 2
 
4 5
 
Accessing arrays
 
  
 +
for i = 1 : n
 +
  c(i) = 1/i;
 +
end
  
Basic Matrix Commands
+
== Funkcie ==
• rank(A) -> rank of A
 
• det(A) -> determinant of A
 
• inv(A) -> finds inverse of A if possible
 
• A' -> transpose of A (conjugate if complex)
 
• eye(n) -> return an identity matrix of dimension n
 
• zeros(n,m) -> return a 0 matrix of dimension n x m
 
• ones(n,m) -> return a 1 matrix of dimension n x m
 
• rref(A) -> return the reduced row echelon of A
 
• [vec,val] = eig(A)
 
-> returns the eigenvalues/vectors of A
 
• size(A) -> return the dimensions of A
 
  
 +
Do externého súboru, tzv. ''skriptu'', alebo  ''m-file'' môžeme uložiť ľubovoľnú
 +
postupnosť príkazov. Po jeho skončení ostávajú všetky medzivýsledky a premenné v pamäti.
  
 +
Ak sa začiatok súboru označí ako '''function''', môžeme odovzdávať aj parametre a
 +
medzivýsledky po skončení funkcie zaniknú.
 +
 +
Funkcie sa dajú písať aj inline, ale najčastejšie sa používa externý súbor, tzv. m-file.
 +
 +
Do súboru [[Media:maxmin.m|maxmin.m]] uložte nasledovné príkazy
 +
 +
<source lang="octave">
 +
function [minimum,maximum] = maxmin(x)
 +
 +
%
 +
%    Funkcia MAXMIN najde maximum a minimum vektora x.
 +
%    Text, ktory je tu sa vypisuje pri help maxmin
 +
%
  
for
 
for i = 1:m
 
for j = 1:2:n
 
H(i,j) = 1/(i+j);
 
end
 
end
 
  
Functions
 
3. External Macros:
 
Create a file called “statistics.m” with the following contents:
 
function [mean,stdev] = statistics(x)
 
 
n = length(x);
 
n = length(x);
mean = sum(x)/n;
+
minimum = min(x);
stdev = sqrt(sum((x-mean).^2/n));
+
maximum = max(x);
You can now call your statistics() function from other Matlab
+
</source>
programs:
 
A = [ 0, 1, 2, 3, 4, 5]
 
[mean, stdev] = statistics(A)
 
  
Loading Data
+
Odteraz môžeme zavolať z našich programov funkciu <TT>maxmin()</TT>
• Loading single column data is easy
+
 
X = load sunspots.dat
+
octave:51> A = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
• For multicolumn data, it's almost as easy:
+
octave:52> [x1, x2] = maxmin(A)
load sunspots.dat
+
x1 =  1
year = sunspots(:,1)
+
x2 =  10
magnitude = sunspots(:,2)
+
 
 +
== Načítanie externých dát - Import ==
 +
 
 +
Ak máme data uložené ako ASCII čísla v textovom súbore, potom príkaz
 +
X = load teplota.dat
 +
načíta tieto data do vektora X. Ak je v súbore viac stĺpcov s datami, potom
 +
load teplota.dat
 +
T1 = teplota(:,1)
 +
T2 = teplota(:,2)
 +
urobí rozdelenie do dvoch vektorov.
 +
 
 +
Na načítanie dát z CSV (comma separated values) súboru existuje príkaz
 +
<TT>csvread()</TT>, na načítanie zvukového súboru do matice príkaz <TT>wavread()</TT> a
 +
na načítanie obrázku <TT>imread()</TT>. Podrobnosti získate napr. príkazom
 +
<TT>help imread</TT>.
 +
 
 +
== Uloženie dát do súboru - Export ==
 +
 
 +
Jednotlivé matice je možné uložiť do externého ASCII súboru  a použiť napr. na nakreslenie
 +
grafu, alebo prenos do Excelu a pod.
 +
 
 +
octave.exe:90> save("premenne.mat","A","c");
 +
 
 +
V súbore <TT>premenne.mat</TT> budu uložené matice '''A''' a '''c'''.
 +
Ak chceme uložiť súbor ako rad hodnôt oddelených čiarkami (CSV file), použijeme
 +
 
 +
octave.exe:91> csvwrite("pokus.csv",A);
 +
 
 +
Okrem toho existujú príkazy na export do .wav súboru (<TT>wavwrite</TT>)
 +
a na ukladanie obrázkov (<TT>imwrite</TT>)
 +
 
 +
 
 +
== Riešenie rovníc (aj sústavy, aj nelineárnych) ==
 +
 
 +
octave:1>#  Zadefinujeme funkciu
 +
octave:1>  function y = f (x)
 +
>  y=x^3+x^2-3*x-3;
 +
> endfunction
 +
 +
octave:2># Solve System for Root Starting at x0=+1.0:
 +
octave:2> [x, info] = fsolve ("f", 1.)
 +
 
 +
x = 1.7321
 +
 +
info = 1
 +
 
 +
octave:3>  # Comment: Solve System for Root Starting at x0=0.0:
 +
octave:3> [x, info] = fsolve ("f", 0.)
 +
 +
x = -1
 +
 +
info = 1
 +
 +
octave:3>  # Comment: Solve System for Root Starting at x0=-2.0:
 +
octave:3> [x,info]=fsolve("f",-2.)
 +
x = -1.7321
 +
 +
info = 1
 +
 +
octave:4> # Comment: Go to Next Problem:
 +
 +
Solution of 2 Equations in 2 Unknowns:
 +
 +
octave:4>  # Comment: Define Function:
 +
octave:4>  function y = f (x)
 +
>  y(1) = -2*x(1)^2 + 3*x(1)*x(2)  + 4*sin(x(2)) - 6;
 +
> y(2) = 3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4;
 +
> endfunction
 +
 +
octave:5>  # Comment: Solve System for Vector Root Starting at [1; 2]:
 +
octave:5> [x, info] = fsolve ("f", [1; 2])
 +
 +
x =
 +
 +
  0.57983
 +
  2.54621
 +
 +
info = 1
 +
 +
 +
== Literatúra ==
  
Saving Data
+
* J. Buša: ''[http://people.tuke.sk/jan.busa/kega/octave.html Octave]'' - slovenská príručka
• You can save your entire workspace in Matlab format...
+
* J. Doboš: ''[http://people.tuke.sk/jan.busa/kega/gnuplot.html Gnuplot]'' - slovenská príručka
save workspace.mat
+
* David F. Griffiths: ''[http://www.maths.dundee.ac.uk/~ftp/na-reports/MatlabNotes.pdf An Introduction to Matlab]''
• Or just individual variables
+
* Hubert Selhofer: ''[http://math.jacobs-university.de/oliver/teaching/iub/resources/octave/octave-intro.pdf Introduction to GNU Octave]''
p = rand(1, 10);
+
* Dr. P.J.G. Long: ''[http://www-mdp.eng.cam.ac.uk/CD/engapps/octave/octavetut.pdf Introduction to Octave]''
q = ones(10);
+
* Kermit Sigmon: ''[http://cs.gmu.edu/~zduric/cs580/primer40.pdf Matlab primer]'' ([http://artax.karlin.mff.cuni.cz/~beda/cz/matlab/primercz/matlab-primer.html preklad do češtiny])
save('variables.mat', 'p', 'q')
 
  
 +
* [http://www.octave.cz/ http://www.octave.cz/]
 +
* Pavel Karban: ''Vypocty a simulace v programech Matlab a Simulink.'' Vyslo v Computer Press.
  
You can export your data to a CSV text file:
+
[[Category:DSP]]
A = [ 1, 2, 3, 4 ; 5, 6, 7, 8];
 
dlmwrite('outputfile.out', A, ',')
 

Latest revision as of 11:02, 15 February 2012

Matlab je programovací jazyk (aj celé prostredie), ktoré umožňuje riešiť zložité matematické a inžinierske výpočty. Jeho názov je skratkou z Matrix Laboratory, čo znamená, že jeho hlavným prvkom sú matice a operácie s nimi.

Octave je programovací jazyk vyvíjaný pod GNU licenciou a je v maximálnej možnej miere kompatibilný s jazykom Matlab. Je určený na numerické výpočty, riešenie lineárnych i nelineárnych problémov. Ako grafickú nadstavbu môže používať Gnuplot.

Zíde sa vám podrobný manuál k Octave on-line alebo aj inštruktážne stránky firmy Mathworks k Matlabu.

  • J. Buša: Octave - slovenská príručka
  • J. Doboš: Gnuplot - slovenská príručka


Základy práce s programom

Octave/Matlab nie je kompilátor, ale interpret, príkazy sa vykonávajú bezprostredne po zadaní. Po spustení teda môžeme do príkazového riadku programu písať priamo matematické výrazy, ktoré program bezprostredne vyhodnotí:

octave:1> 2 + 3
ans = 5
octave:2> cos(pi)
ans = -1

Octave dokáže priamo pracovať aj s komplexnými číslami:

octave:3> (1+2i)*(3+4i)
ans = -5 + 10i

Premenné sú case sensitive a môžeme ich používať kdekoľvek bez predošlej deklarácie. V predošlých príkladoch sa vo výpise objavila jedna premenná, ktorá sa používa na odovzdávanie posledného výsledku (ans).

octave:4> frekvencia = 50 % [Hz]
frekvencia = 50
octave:5> ans + 1         % Premenna ans obsahuje posledny vysledok
ans =  -4 + 10i

V predošlých príkladoch sme ukázali aj používanie komentárov, začínajú znakom percento. Ak sa nám z nejakého dôvodu nehodí zobrazovanie výsledku, ukončíme príkaz bodkočiarkou. Tá potlačí výpis odpovede. Ak je riadok príliš dlhý, môžeme troma bodkami naznačiť jeho pokračovanie na nasledujúcom...

octave:6> suma = 1 + 1/2 + 1/3 + ...
> 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9;

Reťazce môžeme uzatvárať do úvodzoviek, alebo apostrofov. Druhý spôsob tu nebudeme používať, pretože apostrof sa používa aj na transpozíciu a okrem toho sa nepáči ani tejto wiki.

octave:7> napis = "Ahoj Peter!";

Ak chceme zobraziť hodnotu v nejakej premennej, jednoducho napíšeme jej názov (bez bodkočiarky)

octave:8> suma
suma =  2.8290

Ak si chcete uchovať záznam z práce s programom, príkazmi diary on a diary off zapnete či vypnete logovanie do súboru, ktorý sa volá diary. Ku každému príkazu v systéme existuje help, ktorý sa vyvolá help príkaz.

Matice, vektory, skaláry

V Matlabe/Octave je všetko matica. Vektor je špeciálny prípad matice s jedným riadkom/stĺpcom, skalár je špeciálny prípad matice s jedným riadkom a jedným stĺpcom.

octave:9> skalar = 37;
octave:10> riadkovy_vektor = [ 1 2 3 4 5 6 7 ]  % ak treba, mozeme oddelovat ciarkami
riadkovy_vektor =

  1   2   3   4   5   6   7

 octave:11> stlpcovy_vektor = [0.1; 0.2; 0.3; 0.4; 0.5];
 stlpcovy_vektor =

  0.10000
  0.20000
  0.30000
  0.40000
  0.50000

 octave:12> matica = [ 0 1 2; 3 4 5 ; 6 7 8 ]
 matica =

  0   1   2
  3   4   5
  6   7   8

Viacrozmerná matica (používa sa napríklad pri obrázkoch - pre RGB zložky) Konkrétne táto má rozmer 2 x 2 x 3

octave:34> c(1,1,:)=[1 2 3];
octave:35> c(1,2,:)=[4 5 6];
octave:36> c(2,1,:)=[7 8 9];
octave:37> c(2,2,:)=[0 0 0];
octave:38> c
c =

ans(:,:,1) =

   1   4
   7   0

ans(:,:,2) = 

   2   5
   8   0

ans(:,:,3) =

   3   6
   9   0

Základné operátory

+    Súčet
-    Rozdiel
*    Súčin
/    Podiel
^    Mocnina
'    Komplexne združená transpozícia
.*   Súčin po prvkoch vektora/matice
./   Podiel po prvkoch 
.^   Umocnenie po prvkoch
.'   Nekonjugovaná transpozícia


Operátor dvojbodka

Toto je veľmi mocný nástroj. Dá sa použiť napríklad pre vytvorenie postupnosti čísel buď s krokom 1, alebo s definovaným krokom

octave.exe:40> n = 5;
octave.exe:41> A = 1:n
A =

  1  2  3  4  5

octave.exe:42> A = 1:0.3:n
A =

 Columns 1 through 8:

   1.0000   1.3000   1.6000   1.9000   2.2000   2.5000   2.8000   3.1000 

 Columns 9 through 14:

   3.4000   3.7000   4.0000   4.3000   4.6000   4.9000

Prístup k prvkom matice

Pre jednotlivé prvky použijeme indexy v okrúhlych zátvorkách

octave.exe:44> A = [ 0 1 2; 3 4 5 ; 6 7 8 ]
A = 

   0   1   2
   3   4   5
   6   7   8

octave.exe:46> A(1,3)
ans =  2
octave.exe:48> A(2,:)
ans =

   3   4   5

octave.exe:49> A(1:2,1:2)
ans =

   0   1
   3   4

Základné príkazy pre matice

  • length(v) počet prvkov vektora v
  • [Rows,Columns] = size(A) počet riadkov a stĺpcov matice A
  • det(A) determinant matice A
  • inv(A) inverzná matica k A
  • A' transponovaná matica
  • rank(A) hodnosť matice A (počet lineárne nezávislých riadkov alebo stĺpcov)
  • eye(n) vytvorí jednotkovú maticu rozmeru n x n
  • zeros(n,m) vytvorí nulovú maticu rozmerov n x m
  • ones(n,m) vytvorí maticu zo samých 1 rozmerov n x m

Riadiace príkazy

Ako každý poriadny programovací jazyk, aj tento má testy if a case a cykly while a for

for i = 1 : n
  c(i) = 1/i;
end

Funkcie

Do externého súboru, tzv. skriptu, alebo m-file môžeme uložiť ľubovoľnú postupnosť príkazov. Po jeho skončení ostávajú všetky medzivýsledky a premenné v pamäti.

Ak sa začiatok súboru označí ako function, môžeme odovzdávať aj parametre a medzivýsledky po skončení funkcie zaniknú.

Funkcie sa dajú písať aj inline, ale najčastejšie sa používa externý súbor, tzv. m-file.

Do súboru maxmin.m uložte nasledovné príkazy

function [minimum,maximum] = maxmin(x)

%
%    Funkcia MAXMIN najde maximum a minimum vektora x.
%    Text, ktory je tu sa vypisuje pri help maxmin
%


n = length(x);
minimum = min(x);
maximum = max(x);

Odteraz môžeme zavolať z našich programov funkciu maxmin()

octave:51> A = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
octave:52> [x1, x2] = maxmin(A)
x1 =  1
x2 =  10

Načítanie externých dát - Import

Ak máme data uložené ako ASCII čísla v textovom súbore, potom príkaz

X = load teplota.dat

načíta tieto data do vektora X. Ak je v súbore viac stĺpcov s datami, potom

load teplota.dat
T1 = teplota(:,1)
T2 = teplota(:,2)

urobí rozdelenie do dvoch vektorov.

Na načítanie dát z CSV (comma separated values) súboru existuje príkaz csvread(), na načítanie zvukového súboru do matice príkaz wavread() a na načítanie obrázku imread(). Podrobnosti získate napr. príkazom help imread.

Uloženie dát do súboru - Export

Jednotlivé matice je možné uložiť do externého ASCII súboru a použiť napr. na nakreslenie grafu, alebo prenos do Excelu a pod.

octave.exe:90> save("premenne.mat","A","c");

V súbore premenne.mat budu uložené matice A a c. Ak chceme uložiť súbor ako rad hodnôt oddelených čiarkami (CSV file), použijeme

octave.exe:91> csvwrite("pokus.csv",A);

Okrem toho existujú príkazy na export do .wav súboru (wavwrite) a na ukladanie obrázkov (imwrite)


Riešenie rovníc (aj sústavy, aj nelineárnych)

octave:1>#  Zadefinujeme funkciu 
octave:1>  function y = f (x)
>  y=x^3+x^2-3*x-3;
> endfunction

octave:2># Solve System for Root Starting at x0=+1.0:
octave:2> [x, info] = fsolve ("f", 1.)
 
x = 1.7321

info = 1
octave:3>  # Comment: Solve System for Root Starting at x0=0.0:
octave:3> [x, info] = fsolve ("f", 0.)

x = -1

info = 1

octave:3>  # Comment: Solve System for Root Starting at x0=-2.0:
octave:3> [x,info]=fsolve("f",-2.)
x = -1.7321

info = 1

octave:4> # Comment: Go to Next Problem:

Solution of 2 Equations in 2 Unknowns:

octave:4>  # Comment: Define Function:
octave:4>  function y = f (x)
>  y(1) = -2*x(1)^2 + 3*x(1)*x(2)   + 4*sin(x(2)) - 6;
> y(2) =  3*x(1)^2 - 2*x(1)*x(2)^2 + 3*cos(x(1)) + 4;
> endfunction

octave:5>  # Comment: Solve System for Vector Root Starting at [1; 2]:
octave:5> [x, info] = fsolve ("f", [1; 2])

x =

  0.57983
  2.54621

info = 1


Literatúra

  • http://www.octave.cz/
  • Pavel Karban: Vypocty a simulace v programech Matlab a Simulink. Vyslo v Computer Press.