Difference between revisions of "Matlab/Octave"

From RoboWiki
Jump to: navigation, search
(Základy práce s programom)
Line 46: Line 46:
  
 
  octave:6> suma = 1 + 1/2 + 1/3 + ...
 
  octave:6> suma = 1 + 1/2 + 1/3 + ...
  1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9;
+
  > 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ť,
 
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 sa nepáči wiki.
  
  octave:6> napis = "Ahoj Peter!";
+
  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 <TT>diary on</TT> a <TT>diary off</TT>
 
Ak si chcete uchovať záznam z práce s programom, príkazmi <TT>diary on</TT> a <TT>diary off</TT>
Line 57: 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 ===
 +
 +
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
|Addition
+
  0.30000
|----
+
  0.40000
|-
+
  0.50000
|Subtraction
 
|----
 
|2
 
|Anca
 
|----
 
|3
 
|Mária
 
|----
 
|}
 
  
 +
  octave:12> matica = [ 0 1 2; 3 4 5 ; 6 7 8 ]
 +
matica =
  
 +
  0  1  2
 +
  3  4  5
 +
  6  7  8
  
 +
octave:13> 3D_matica =
  
  
* Multiplication
+
==== Základné operátory ====
/ Division
 
^ Power
 
' Complex conjugate transpose
 
.* Element-by-element multiplication
 
./ Element-by-element division
 
.^ Element-by-element power
 
.' Unconjugated array transpose
 
  
  
Basic Data Structures
+
+ Súčet
• Scalars
+
- Rozdiel
scalar = 1
+
* Súčin
• Row Vector
+
/ Podiel
rowvector = [ 1, 2, 3, 4, 5 ]
+
^ Mocnina
•Column vector
+
' Komplexne združená transpozícia
colvector = [ 1; 2; 3; 4; 5 ]
+
.* Súčin po prvkoch vektora/matice
 +
./ Podiel po prvkoch
 +
.^ Umocnenie po prvkoch
 +
.' Nekonjugovaná transpozícia
  
Array (matrix)
 
matrix = [ 1, 2 ; 3, 4 ]
 
  
  
Line 104: Line 113:
 
• You can change the step size by:
 
• You can change the step size by:
 
A = [ 1:0.1:n ]
 
A = [ 1:0.1:n ]
 +
 +
Indexing and slicing
 +
 +
    * v(k) is the $ k$-th element of the row or column vector $ v$.
 +
    * A(k,l) is the matrix element $ a_{kl}$.
 +
    * 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$.
 +
    * A(:,l) is the $ l$th column of matrix $ A$.
 +
 +
Querying dimensions:
 +
 +
    * length(v) returns the number of elements of the vector $ v$.
 +
    * [Rows,Columns] = size(A) returns the number of rows and columns of the matrix $ A$.
  
 
Accessing elements of a vector and array
 
Accessing elements of a vector and array

Revision as of 21:22, 18 June 2008

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 = 4
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 sa nepáči 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
octave:13> 3D_matica = 


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


Shortcuts • 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

   * v(k) is the $ k$-th element of the row or column vector $ v$.
   * A(k,l) is the matrix element $ a_{kl}$.
   * 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$.
   * A(:,l) is the $ l$th column of matrix $ A$.

Querying dimensions:

   * length(v) returns the number of elements of the vector $ v$.
   * [Rows,Columns] = size(A) returns the number of rows and columns of the matrix $ A$.

Accessing elements of a vector and array 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 a = [1, 2, 3; 4, 5, 6; 7, 8, 9]; a(1:2, 1:2) ans = 1 2 4 5 Accessing arrays


Basic Matrix Commands • 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


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); mean = sum(x)/n; stdev = sqrt(sum((x-mean).^2/n)); You can now call your statistics() function from other Matlab programs: A = [ 0, 1, 2, 3, 4, 5] [mean, stdev] = statistics(A)

Loading Data • Loading single column data is easy X = load sunspots.dat • For multicolumn data, it's almost as easy: load sunspots.dat year = sunspots(:,1) magnitude = sunspots(:,2)

Saving Data • You can save your entire workspace in Matlab format... save workspace.mat • Or just individual variables p = rand(1, 10); q = ones(10); save('variables.mat', 'p', 'q')


You can export your data to a CSV text file: A = [ 1, 2, 3, 4 ; 5, 6, 7, 8]; dlmwrite('outputfile.out', A, ',')