Using Octave: Difference between revisions

From Octave
Jump to navigation Jump to search
(→‎Comments: wiki markup)
(8 intermediate revisions by one other user not shown)
Line 22: Line 22:


The output of every command is printed to the console unless terminated with
The output of every command is printed to the console unless terminated with
a semicolon <code>;</code>.  The <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFdisp.html">disp</a> command can be used to print output
a semicolon <code>;</code>.  The [https://www.gnu.org/software/octave/doc/interpreter/XREFdisp.html disp] command can be used to print output
anywhere.  Use <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFquit.html">exit</a> or <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFquit.html">quit</a> to quit the console.
anywhere.  Use [https://www.gnu.org/software/octave/doc/interpreter/XREFquit.html exit] or [https://www.gnu.org/software/octave/doc/interpreter/XREFquit.html quit] to quit the console.
Read more
Read more [https://www.gnu.org/software/octave/doc/interpreter/Simple-Examples.html about command evaluation].
<a href="https://www.gnu.org/software/octave/doc/interpreter/Simple-Examples.html">about command evaluation</a>.</p><pre class="oct-code">t = 99 + 1  <span class="comment"># prints 't = 100'</span>
t = 99 + 1; <span class="comment"># nothing is printed</span>
disp(t);</pre><pre class="oct-code-output">t =  100
100
</pre>


<syntaxhighlight lang="octave">t = 99 + 1  # prints 't = 100'</syntaxhighlight>
<syntaxhighlight lang="text">t =  100</syntaxhighlight>


<syntaxhighlight lang="octave">t = 99 + 1; # nothing is printed
disp(t);</syntaxhighlight>
<syntaxhighlight lang="text"> 100</syntaxhighlight>


= Elementary math =
= Elementary math =
Line 37: Line 37:
Many mathematical operators are available in addition to the standard
Many mathematical operators are available in addition to the standard
arithmetic.  Operations are floating-point.  Read more
arithmetic.  Operations are floating-point.  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Arithmetic.html">about elementary math</a>.</p><pre class="oct-code">x = 3/4*pi;
[https://www.gnu.org/software/octave/doc/interpreter/Arithmetic.html about elementary math].
y = sin(x)</pre><pre class="oct-code-output">y =  0.70711
 
</pre>
<syntaxhighlight lang="octave">x = 3/4 * pi;
y = sin (x)</syntaxhighlight>
<syntaxhighlight lang="text">y =  0.70711</syntaxhighlight>
 




Line 48: Line 51:
to as vectors.  Use a space or a comma <code>,</code> to separate elements in a row and
to as vectors.  Use a space or a comma <code>,</code> to separate elements in a row and
semicolon <code>;</code> to start a new row.  Read more
semicolon <code>;</code> to start a new row.  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html">about matrices</a>.</p><pre class="oct-code">rowVec = [8 6 4]</pre><pre class="oct-code-output">rowVec =
[https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html about matrices].
<syntaxhighlight lang="octave">rowVec = [8 6 4]</syntaxhighlight>
<syntaxhighlight lang="text">rowVec =
   8  6  4
   8  6  4
</pre><pre class="oct-code">columnVec = [8; 6; 4]</pre><pre class="oct-code-output">columnVec =
</syntaxhighlight>
 
<syntaxhighlight lang="octave">columnVec = [8; 6; 4]</syntaxhighlight>
<syntaxhighlight lang="text">columnVec =
   8
   8
   6
   6
   4
   4
</pre><pre class="oct-code">mat = [8 6 4; 2 0 -2]</pre><pre class="oct-code-output">mat =
</syntaxhighlight>
 
<syntaxhighlight lang="octave">mat = [8 6 4; 2 0 -2]</syntaxhighlight>
<syntaxhighlight lang="text">mat =
   8  6  4
   8  6  4
   2  0  -2
   2  0  -2
</pre><pre class="oct-code">size(mat)</pre><pre class="oct-code-output">ans =
</syntaxhighlight>
 
<syntaxhighlight lang="octave">size(mat)</syntaxhighlight>
<syntaxhighlight lang="text">ans =
   2  3
   2  3
</pre><pre class="oct-code">length(rowVec)</pre><pre class="oct-code-output">ans =  3
</syntaxhighlight>
</pre>
 
<syntaxhighlight lang="octave">length(rowVec)</syntaxhighlight>
<syntaxhighlight lang="text">ans =  3</syntaxhighlight>




Line 68: Line 84:
Many common linear algebra operations are simple to program using Octave’s
Many common linear algebra operations are simple to program using Octave’s
matrix syntax.  Read more
matrix syntax.  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html">about linear algebra</a>.</p><pre class="oct-code">columnVec * rowVec</pre><pre class="oct-code-output">ans =
[https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html about linear algebra].
 
<syntaxhighlight lang="octave">columnVec * rowVec</syntaxhighlight>
<syntaxhighlight lang="text">ans =
   64  48  32
   64  48  32
   48  36  24
   48  36  24
   32  24  16
   32  24  16
</pre><pre class="oct-code">rowVec * columnVec</pre><pre class="oct-code-output">ans =  116
</syntaxhighlight>
</pre><pre class="oct-code">columnVec<span class="string">'</span></pre><pre class="oct-code-output">ans =
  8  6  4
</pre>


<syntaxhighlight lang="octave">rowVec * columnVec</syntaxhighlight>
<syntaxhighlight lang="text">ans =  116</syntaxhighlight>


<syntaxhighlight lang="octave">columnVec'</syntaxhighlight>
<syntaxhighlight lang="text">ans =
  8  6  4
</syntaxhighlight>


= Accessing Elements =
= Accessing Elements =
Line 83: Line 105:
Octave is 1-indexed.  Matrix elements are accessed as
Octave is 1-indexed.  Matrix elements are accessed as
<code>matrix(rowNum, columnNum)</code>.  Read more
<code>matrix(rowNum, columnNum)</code>.  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Index-Expressions.html">about accessing elements</a>.</p><pre class="oct-code">mat(2,3)</pre><pre class="oct-code-output">ans = -2
[https://www.gnu.org/software/octave/doc/interpreter/Index-Expressions.html about accessing elements].
</pre>


<syntaxhighlight lang="octave">mat(2,3)</syntaxhighlight>
<syntaxhighlight lang="text">ans = -2</syntaxhighlight>




= Control flow wih loops =
 
= Control flow with loops =


Octave supports <code>for</code> and <code>while</code> loops, as well as other control flow
Octave supports <code>for</code> and <code>while</code> loops, as well as other control flow
structures.  Read more
structures.  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Statements.html">about control flow</a>.</p><pre class="oct-code">x = zeros (50,1);
[https://www.gnu.org/software/octave/doc/interpreter/Statements.html about control flow].
<span class="keyword">for</span> i = 1:2:100 <span class="comment"># iterate from 1 to 100 with step size 2</span>
 
<syntaxhighlight lang="octave">x = zeros (50,1);
for i = 1:2:100 # iterate from 1 to 100 with step size 2
   x(i) = i^2;
   x(i) = i^2;
<span class="keyword">endfor</span>
endfor


y = zeros (50,1);
y = zeros (50,1);
k = 1;
k = 1;
step = 2;
step = 2;
<span class="keyword">while</span> (k <= (100-step))
while (k <= 100)
   y(i) = k^2;
   y(k) = k^2;
   k = k + step;
   k = k + step;
<span class="keyword">endwhile</span></pre><pre class="oct-code-output"></pre>
endwhile</syntaxhighlight>
 
 


= Vectorization =
= Vectorization =
Line 112: Line 136:
operators <code>*</code>, <code>/</code>, and <code>^</code> all support element-wise operations writing
operators <code>*</code>, <code>/</code>, and <code>^</code> all support element-wise operations writing
a dot <code>.</code> before the operators.  Many other functions operate element-wise
a dot <code>.</code> before the operators.  Many other functions operate element-wise
by default (<a href="https://www.gnu.org/software/octave/doc/interpreter/XREFsin.html">sin</a>, <code>+</code>, <code>-</code>, etc.).  Read more
by default ([https://www.gnu.org/software/octave/doc/interpreter/XREFsin.html sin], <code>+</code>, <code>-</code>, etc.).  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Vectorization-and-Faster-Code-Execution.html">about vectorization</a>.</p><pre class="oct-code">i = 1:2:100;      <span class="comment"># create an array with 50-elements</span>
[https://www.gnu.org/software/octave/doc/interpreter/Vectorization-and-Faster-Code-Execution.html about vectorization].
x = i.^2;        <span class="comment"># each element is squared</span>
 
y = x + 9;        <span class="comment"># add 9 to each element</span>
<syntaxhighlight lang="octave">i = 1:2:100;      # create an array with 50-elements
z = y./i;        <span class="comment"># divide each element in y by the corresponding value in i</span>
x = i.^2;        # each element is squared
w = sin (i / 10); <span class="comment"># take the sine of each element divided by 10</span>
y = x + 9;        # add 9 to each element
</pre><pre class="oct-code-output"></pre>
z = y./i;        # divide each element in y by the corresponding value in i
w = sin (i / 10); # take the sine of each element divided by 10
</syntaxhighlight>




Line 124: Line 150:
= Plotting =
= Plotting =


The function <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFplot.html">plot</a> can be called with vector arguments to
The function [https://www.gnu.org/software/octave/doc/interpreter/XREFplot.html plot] can be called with vector arguments to
create 2D line and scatter plots.  Read more
create 2D line and scatter plots.  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Two_002dDimensional-Plots.html">about plotting</a>.</p><pre class="oct-code">plot (i/10, w);
[https://www.gnu.org/software/octave/doc/interpreter/Two_002dDimensional-Plots.html about plotting].
title (<span class="string">'w = sin(i/10)'</span>);
xlabel (<span class="string">'i ÷ 10'</span>);
ylabel (<span class="string">'w'</span>);</pre><pre class="oct-code-output"></pre><img src="octave_basics-1.png" alt="octave_basics-1.png">


<syntaxhighlight lang="octave">plot (i / 10, w);
title ('w = sin (i / 10)');
xlabel ('i / 10');
ylabel ('w');</syntaxhighlight>


[[File:Using octave-1.png|thumb|center]]


= Strings =
= Strings =


Strings are simply arrays of characters.  Strings can be composed using
Strings are simply arrays of characters.  Strings can be composed using
C-style formatting with <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFsprintf.html">sprintf</a> or
C-style formatting with [https://www.gnu.org/software/octave/doc/interpreter/XREFsprintf.html sprintf] or
<a href="https://www.gnu.org/software/octave/doc/interpreter/XREFfprintf.html">fprintf</a>.  Read more
[https://www.gnu.org/software/octave/doc/interpreter/XREFfprintf.html fprintf].  Read more
<a href="https://www.gnu.org/software/octave/doc/interpreter/Strings.html">about strings</a>.</p><pre class="oct-code">firstString = <span class="string">"hello world"</span>;
[https://www.gnu.org/software/octave/doc/interpreter/Strings.html about strings].
secondString = <span class="string">"!"</span>;
 
[firstString, secondString] <span class="comment"># concatenate both strings</span>
<syntaxhighlight lang="octave">firstString = "hello world";
</pre><pre class="oct-code-output">ans = hello world!
secondString = "!";
</pre><pre class="oct-code">fprintf (<span class="string">"%s %.10f \n"</span>, <span class="string">"The number is:"</span>, 10)</pre><pre class="oct-code-output">The number is: 10.0000000000  
[firstString, secondString] # concatenate both strings
</pre>
</syntaxhighlight>
<syntaxhighlight lang="text">ans = hello world!</syntaxhighlight>
 
<syntaxhighlight lang="octave">fprintf ("%s %.10f \n", "The number is:", 10)</syntaxhighlight>
<syntaxhighlight lang="text">The number is: 10.0000000000</syntaxhighlight>




Line 150: Line 182:


Conditional statements can be used to create branching logic in your code.
Conditional statements can be used to create branching logic in your code.
Read more
Read more [https://www.gnu.org/software/octave/doc/interpreter/The-if-Statement.html in the manual].
<a href="https://www.gnu.org/software/octave/doc/interpreter/The-if-Statement.html">in the manual</a>.</p><pre class="oct-code"><span class="comment"># Print 'Foo'      if divisible by 7,</span>
 
<span class="comment">#      'Fizz'    if divisible by 3,</span>
<syntaxhighlight lang="octave"># Print 'Foo'      if divisible by 7,
<span class="comment">#      'Buzz'    if divisible by 5,</span>
#      'Fizz'    if divisible by 3,
<span class="comment">#      'FizzBuzz' if divisible by 3 and 5</span>
#      'Buzz'    if divisible by 5,
<span class="keyword">for</span> i = 1:1:20
#      'FizzBuzz' if divisible by 3 and 5
   outputString = <span class="string">""</span>;
for i = 1:1:20
   <span class="keyword">if</span> (rem (i, 3) == 0)  <span class="comment"># rem is the remainder function</span>
   outputString = "";
     outputString = [outputString, <span class="string">"Fizz"</span>];
   if (rem (i, 3) == 0)  # rem is the remainder function
   <span class="keyword">endif</span>
     outputString = [outputString, "Fizz"];
   <span class="keyword">if</span> (rem (i, 5) == 0)
   endif
     outputString = [outputString, <span class="string">"Buzz"</span>];
   if (rem (i, 5) == 0)
   <span class="keyword">elseif</span> (rem(i,7) == 0)
     outputString = [outputString, "Buzz"];
     outputString = <span class="string">"Foo"</span>;
   elseif (rem(i,7) == 0)
   <span class="keyword">else</span>
     outputString = "Foo";
   else
     outputString = outputString;
     outputString = outputString;
   <span class="keyword">endif</span>
   endif
   fprintf(<span class="string">"i=%g: %s \n"</span>, i, outputString);
   fprintf("i=%g: %s \n", i, outputString);
<span class="keyword">endfor</span></pre><pre class="oct-code-output">i=1:   
endfor</syntaxhighlight>
 
<syntaxhighlight lang="text">i=1:   
i=2:   
i=2:   
i=3: Fizz  
i=3: Fizz  
Line 188: Line 223:
i=19:   
i=19:   
i=20: Buzz  
i=20: Buzz  
</pre>
</syntaxhighlight>




Line 194: Line 229:
= Getting Help =
= Getting Help =


The <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFhelp.html">help</a> and <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFdoc.html">doc</a> commands can be invoked at the
The [https://www.gnu.org/software/octave/doc/interpreter/XREFhelp.html help] and [https://www.gnu.org/software/octave/doc/interpreter/XREFdoc.html doc] commands can be invoked at the
Octave prompt to print documentation for any function.</p><pre class="pre-code">help plot
Octave prompt to print documentation for any function.
doc plot</pre>
 
<syntaxhighlight lang="octave">help plot
doc plot</syntaxhighlight>




Line 203: Line 240:


Community-developed packages can be added from the
Community-developed packages can be added from the
<a href="http://octave.sourceforge.net/index.html">Octave Forge</a> website to extend
[http://octave.sourceforge.net/index.html Octave Forge] website to extend
the functionality of Octave’s core library.  (Matlab users: Forge packages
the functionality of Octave’s core library.  (Matlab users: Forge packages
act similarly to Matlab’s toolboxes.)  The <a href="https://www.gnu.org/software/octave/doc/interpreter/XREFpkg.html">pkg</a> command is used
act similarly to Matlab’s toolboxes.)  The [https://www.gnu.org/software/octave/doc/interpreter/XREFpkg.html pkg] command is used
to manage these packages.  For example, to use the image processing library
to manage these packages.  For example, to use the image processing library
from the Forge, use:</p><pre class="pre-code">pkg install -forge image <span class="comment"># install package</span>
from the Forge, use:
pkg load image          <span class="comment"># load new functions into workspace</span>
 
</pre><p><a href="https://www.gnu.org/software/octave/doc/interpreter/Packages.html">Read more about packages</a>.</p>
<syntaxhighlight lang="octave">pkg install -forge image # install package
pkg load image          # load new functions into workspace
</syntaxhighlight>
 
[https://www.gnu.org/software/octave/doc/interpreter/Packages.html Read more about packages].


[[Category:Tutorials]]
[[Category:Tutorials]]

Revision as of 08:27, 21 April 2017

First, follow the installation guide to install GNU Octave on your system. Then, launch the interactive prompt by typing octave in a terminal or by clicking the icon in the programs menu. For further guidance, see the manual page on Running Octave.


Variable Assignment

Assign values to variables with = (Note: assignment is pass-by-value). Read more about variables.

a = 1;

Comments

# or % start a comment line, that continues to the end of the line. Read more about comments.

Command evaluation

The output of every command is printed to the console unless terminated with a semicolon ;. The disp command can be used to print output anywhere. Use exit or quit to quit the console. Read more about command evaluation.

t = 99 + 1  # prints 't = 100'
t =  100
t = 99 + 1; # nothing is printed
disp(t);
 100

Elementary math

Many mathematical operators are available in addition to the standard arithmetic. Operations are floating-point. Read more about elementary math.

x = 3/4 * pi;
y = sin (x)
y =  0.70711



Matrices

Arrays in Octave are called matrices. One-dimensional matrices are referred to as vectors. Use a space or a comma , to separate elements in a row and semicolon ; to start a new row. Read more about matrices.

rowVec = [8 6 4]
rowVec =
   8   6   4
columnVec = [8; 6; 4]
columnVec =
   8
   6
   4
mat = [8 6 4; 2 0 -2]
mat =
   8   6   4
   2   0  -2
size(mat)
ans =
   2   3
length(rowVec)
ans =  3


Linear Algebra

Many common linear algebra operations are simple to program using Octave’s matrix syntax. Read more about linear algebra.

columnVec * rowVec
ans =
   64   48   32
   48   36   24
   32   24   16
rowVec * columnVec
ans =  116
columnVec'
ans =
   8   6   4

Accessing Elements

Octave is 1-indexed. Matrix elements are accessed as matrix(rowNum, columnNum). Read more about accessing elements.

mat(2,3)
ans = -2


Control flow with loops

Octave supports for and while loops, as well as other control flow structures. Read more about control flow.

x = zeros (50,1);
for i = 1:2:100 # iterate from 1 to 100 with step size 2
  x(i) = i^2;
endfor

y = zeros (50,1);
k = 1;
step = 2;
while (k <= 100)
  y(k) = k^2;
  k = k + step;
endwhile

Vectorization

For-loops can often be replaced or simplified using vector syntax. The operators *, /, and ^ all support element-wise operations writing a dot . before the operators. Many other functions operate element-wise by default (sin, +, -, etc.). Read more about vectorization.

i = 1:2:100;      # create an array with 50-elements
x = i.^2;         # each element is squared
y = x + 9;        # add 9 to each element
z = y./i;         # divide each element in y by the corresponding value in i
w = sin (i / 10); # take the sine of each element divided by 10


Plotting

The function plot can be called with vector arguments to create 2D line and scatter plots. Read more about plotting.

plot (i / 10, w);
title ('w = sin (i / 10)');
xlabel ('i / 10');
ylabel ('w');
Using octave-1.png

Strings

Strings are simply arrays of characters. Strings can be composed using C-style formatting with sprintf or fprintf. Read more about strings.

firstString = "hello world";
secondString = "!";
[firstString, secondString] # concatenate both strings
ans = hello world!
fprintf ("%s %.10f \n", "The number is:", 10)
The number is: 10.0000000000


If-else

Conditional statements can be used to create branching logic in your code. Read more in the manual.

# Print 'Foo'      if divisible by 7,
#       'Fizz'     if divisible by 3,
#       'Buzz'     if divisible by 5,
#       'FizzBuzz' if divisible by 3 and 5
for i = 1:1:20
  outputString = "";
  if (rem (i, 3) == 0)  # rem is the remainder function
    outputString = [outputString, "Fizz"];
  endif
  if (rem (i, 5) == 0)
    outputString = [outputString, "Buzz"];
  elseif (rem(i,7) == 0)
    outputString = "Foo";
  else
    outputString = outputString;
  endif
  fprintf("i=%g: %s \n", i, outputString);
endfor
i=1:  
i=2:  
i=3: Fizz 
i=4:  
i=5: Buzz 
i=6: Fizz 
i=7: Foo 
i=8:  
i=9: Fizz 
i=10: Buzz 
i=11:  
i=12: Fizz 
i=13:  
i=14: Foo 
i=15: FizzBuzz 
i=16:  
i=17:  
i=18: Fizz 
i=19:  
i=20: Buzz


Getting Help

The help and doc commands can be invoked at the Octave prompt to print documentation for any function.

help plot
doc plot


Octave forge packages

Community-developed packages can be added from the Octave Forge website to extend the functionality of Octave’s core library. (Matlab users: Forge packages act similarly to Matlab’s toolboxes.) The pkg command is used to manage these packages. For example, to use the image processing library from the Forge, use:

pkg install -forge image # install package
pkg load image           # load new functions into workspace

Read more about packages.