Using Octave: Difference between revisions

From Octave
Jump to navigation Jump to search
(wiki markup for links)
(Updated the package section to use Octave Packages instead of Forge (as forge is being deprecated)
 
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
First, follow the [https://www.gnu.org/software/octave/doc/interpreter/Installation.html installation guide]
First, follow the installation instructions for:
to install GNU Octave on your system. Then, launch the interactive prompt by
* [[Octave for macOS|macOS]]
typing <code>octave</code> in a terminal or by clicking the icon in the programs menu.
* [[Octave for GNU/Linux|GNU/Linux]] and [[Octave for other Unix systems|other Unix systems]]
For further guidance, see the manual page on
* [[Octave_for_Microsoft_Windows|Microsoft Windows]]
[https://www.gnu.org/software/octave/doc/interpreter/Running-Octave.html Running Octave].
or consult the [https://www.gnu.org/software/octave/doc/interpreter/Installation.html GNU Octave manual] to install GNU Octave on your system.
 
Then, start the GNU Octave by clicking the icon in the programs menu or launch the interactive prompt by typing <code>octave</code> in a terminal.
See the manual page on [https://www.gnu.org/software/octave/doc/interpreter/Running-Octave.html running Octave].


[[File:GNU Octave screenshot.png|thumb|center|500px|The GNU Octave graphical user interface (GUI).]]


= Variable Assignment =
= Variable Assignment =
Line 27: Line 29:


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


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


= Elementary math =
= Elementary math =
Line 39: Line 41:
[https://www.gnu.org/software/octave/doc/interpreter/Arithmetic.html about elementary math].
[https://www.gnu.org/software/octave/doc/interpreter/Arithmetic.html about elementary math].


<pre class="oct-code">x = 3/4*pi;
<syntaxhighlight lang="octave">x = 3/4 * pi;
y = sin(x)</pre>
y = sin (x)</syntaxhighlight>
<pre class="oct-code-output">y =  0.70711</pre>
<syntaxhighlight lang="text">y =  0.70711</syntaxhighlight>
 




Line 51: Line 54:
semicolon <code>;</code> to start a new row.  Read more
semicolon <code>;</code> to start a new row.  Read more
[https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html about matrices].
[https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html about matrices].
<pre class="oct-code">rowVec = [8 6 4]</pre>
<syntaxhighlight lang="octave">rowVec = [8 6 4]</syntaxhighlight>
<pre class="oct-code-output">rowVec =
<syntaxhighlight lang="text">rowVec =
   8  6  4
   8  6  4
</pre>
</syntaxhighlight>


<pre class="oct-code">columnVec = [8; 6; 4]</pre>
<syntaxhighlight lang="octave">columnVec = [8; 6; 4]</syntaxhighlight>
<pre class="oct-code-output">columnVec =
<syntaxhighlight lang="text">columnVec =
   8
   8
   6
   6
   4
   4
</pre>
</syntaxhighlight>


<pre class="oct-code">mat = [8 6 4; 2 0 -2]</pre>
<syntaxhighlight lang="octave">mat = [8 6 4; 2 0 -2]</syntaxhighlight>
<pre class="oct-code-output">mat =
<syntaxhighlight lang="text">mat =
   8  6  4
   8  6  4
   2  0  -2
   2  0  -2
</pre>
</syntaxhighlight>


<pre class="oct-code">size(mat)</pre>
<syntaxhighlight lang="octave">size(mat)</syntaxhighlight>
<pre class="oct-code-output">ans =
<syntaxhighlight lang="text">ans =
   2  3
   2  3
</pre>
</syntaxhighlight>


<pre class="oct-code">length(rowVec)</pre>
<syntaxhighlight lang="octave">length(rowVec)</syntaxhighlight>
<pre class="oct-code-output">ans =  3</pre>
<syntaxhighlight lang="text">ans =  3</syntaxhighlight>




Line 85: Line 88:
[https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html about linear algebra].
[https://www.gnu.org/software/octave/doc/interpreter/Linear-Algebra.html about linear algebra].


<pre class="oct-code">columnVec * rowVec</pre>
<syntaxhighlight lang="octave">columnVec * rowVec</syntaxhighlight>
<pre class="oct-code-output">ans =
<syntaxhighlight lang="text">ans =
   64  48  32
   64  48  32
   48  36  24
   48  36  24
   32  24  16
   32  24  16
</pre>
</syntaxhighlight>


<pre class="oct-code">rowVec * columnVec</pre>
<syntaxhighlight lang="octave">rowVec * columnVec</syntaxhighlight>
<pre class="oct-code-output">ans =  116</pre>
<syntaxhighlight lang="text">ans =  116</syntaxhighlight>


<pre class="oct-code">columnVec'</pre>
<syntaxhighlight lang="octave">columnVec'</syntaxhighlight>
<pre class="oct-code-output">ans =
<syntaxhighlight lang="text">ans =
   8  6  4
   8  6  4
</pre>
</syntaxhighlight>
 
 


= Accessing Elements =
= Accessing Elements =
Line 108: Line 109:
[https://www.gnu.org/software/octave/doc/interpreter/Index-Expressions.html about accessing elements].
[https://www.gnu.org/software/octave/doc/interpreter/Index-Expressions.html about accessing elements].


<pre class="oct-code">mat(2,3)</pre>
<syntaxhighlight lang="octave">mat(2,3)</syntaxhighlight>
<pre class="oct-code-output">ans = -2</pre>
<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
Line 119: Line 120:
[https://www.gnu.org/software/octave/doc/interpreter/Statements.html about control flow].
[https://www.gnu.org/software/octave/doc/interpreter/Statements.html about control flow].


<pre class="oct-code">x = zeros (50,1);
<syntaxhighlight lang="octave">x = zeros (50,1);
for i = 1:2:100 # iterate from 1 to 100 with step size 2
for i = 1:2:100 # iterate from 1 to 100 with step size 2
   x(i) = i^2;
   x(i) = i^2;
Line 127: Line 128:
k = 1;
k = 1;
step = 2;
step = 2;
while (k <= (100-step))
while (k <= 100)
   y(i) = k^2;
   y(k) = k^2;
   k = k + step;
   k = k + step;
endwhile</pre>
endwhile</syntaxhighlight>
 
 


= Vectorization =
= Vectorization =
Line 142: Line 141:
[https://www.gnu.org/software/octave/doc/interpreter/Vectorization-and-Faster-Code-Execution.html about vectorization].
[https://www.gnu.org/software/octave/doc/interpreter/Vectorization-and-Faster-Code-Execution.html about vectorization].


<pre class="oct-code">i = 1:2:100;      # create an array with 50-elements
<syntaxhighlight lang="octave">i = 1:2:100;      # create an array with 50-elements
x = i.^2;        # each element is squared
x = i.^2;        # each element is squared
y = x + 9;        # add 9 to each element
y = x + 9;        # add 9 to each element
z = y./i;        # divide each element in y by the corresponding value in i
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
w = sin (i / 10); # take the sine of each element divided by 10
</pre>
</syntaxhighlight>




Line 157: Line 156:
[https://www.gnu.org/software/octave/doc/interpreter/Two_002dDimensional-Plots.html about plotting].
[https://www.gnu.org/software/octave/doc/interpreter/Two_002dDimensional-Plots.html about plotting].


<pre class="oct-code">plot (i/10, w);
<syntaxhighlight lang="octave">plot (i / 10, w);
title (<span class="string">'w = sin(i/10)'</span>);
title ('w = sin (i / 10)');
xlabel (<span class="string">'i ÷ 10'</span>);
xlabel ('i / 10');
ylabel (<span class="string">'w'</span>);</pre>
ylabel ('w');</syntaxhighlight>
 
<img src="octave_basics-1.png" alt="octave_basics-1.png">
 


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


= Strings =
= Strings =
Line 173: Line 170:
[https://www.gnu.org/software/octave/doc/interpreter/Strings.html about strings].
[https://www.gnu.org/software/octave/doc/interpreter/Strings.html about strings].


<pre class="oct-code">firstString = <span class="string">"hello world"</span>;
<syntaxhighlight lang="octave">firstString = "hello world";
secondString = <span class="string">"!"</span>;
secondString = "!";
[firstString, secondString] <span class="comment"># concatenate both strings</span>
[firstString, secondString] # concatenate both strings
</pre><pre class="oct-code-output">ans = hello world!
</syntaxhighlight>
</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  
<syntaxhighlight lang="text">ans = hello world!</syntaxhighlight>
</pre>
 
<syntaxhighlight lang="octave">fprintf ("%s %.10f \n", "The number is:", 10)</syntaxhighlight>
<syntaxhighlight lang="text">The number is: 10.0000000000</syntaxhighlight>




Line 187: Line 186:
Read more [https://www.gnu.org/software/octave/doc/interpreter/The-if-Statement.html in the manual].
Read more [https://www.gnu.org/software/octave/doc/interpreter/The-if-Statement.html in the manual].


<pre class="oct-code"><span class="comment"># Print 'Foo'      if divisible by 7,</span>
<syntaxhighlight lang="octave"># Print 'Foo'      if divisible by 7,
<span class="comment">#      'Fizz'    if divisible by 3,</span>
#      'Fizz'    if divisible by 3,
<span class="comment">#      'Buzz'    if divisible by 5,</span>
#      'Buzz'    if divisible by 5,
<span class="comment">#      'FizzBuzz' if divisible by 3 and 5</span>
#      'FizzBuzz' if divisible by 3 and 5
<span class="keyword">for</span> i = 1:1:20
for i = 1:1:20
   outputString = <span class="string">""</span>;
   outputString = "";
   <span class="keyword">if</span> (rem (i, 3) == 0)  <span class="comment"># rem is the remainder function</span>
   if (rem (i, 3) == 0)  # rem is the remainder function
     outputString = [outputString, <span class="string">"Fizz"</span>];
     outputString = [outputString, "Fizz"];
   <span class="keyword">endif</span>
   endif
   <span class="keyword">if</span> (rem (i, 5) == 0)
   if (rem (i, 5) == 0)
     outputString = [outputString, <span class="string">"Buzz"</span>];
     outputString = [outputString, "Buzz"];
   <span class="keyword">elseif</span> (rem(i,7) == 0)
   elseif (rem(i,7) == 0)
     outputString = <span class="string">"Foo"</span>;
     outputString = "Foo";
   <span class="keyword">else</span>
   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>
endfor</syntaxhighlight>


<pre class="oct-code-output">i=1:   
<syntaxhighlight lang="text">i=1:   
i=2:   
i=2:   
i=3: Fizz  
i=3: Fizz  
Line 226: Line 225:
i=19:   
i=19:   
i=20: Buzz  
i=20: Buzz  
</pre>
</syntaxhighlight>




Line 235: Line 234:
Octave prompt to print documentation for any function.
Octave prompt to print documentation for any function.


<pre class="pre-code">help plot
<syntaxhighlight lang="octave">help plot
doc plot</pre>
doc plot</syntaxhighlight>






= Octave forge packages =
= Octave packages =


Community-developed packages can be added from the
Community-developed packages can be added from the
[http://octave.sourceforge.net/index.html Octave Forge] website to extend
[https://gnu-octave.github.io/packages/ Octave Packages] website to extend
the functionality of Octave’s core library.  (Matlab users: Forge packages
the functionality of Octave’s core library.  (Matlab users: Packages
act similarly to Matlab’s toolboxes.)  The [https://www.gnu.org/software/octave/doc/interpreter/XREFpkg.html pkg] 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 visit its [https://gnu-octave.github.io/packages/image/ page on Octave Packages,] copy the install command and run it in octave
from the Forge, use:


<pre class="pre-code">pkg install -forge image <span class="comment"># install package</span>
<syntaxhighlight lang="octave">pkg install "https://downloads.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/image-2.14.0.tar.gz" # install package
pkg load image          <span class="comment"># load new functions into workspace</span>
pkg load image          # load new functions into workspace
</pre>
</syntaxhighlight>


[https://www.gnu.org/software/octave/doc/interpreter/Packages.html Read more about packages].
[https://www.gnu.org/software/octave/doc/interpreter/Packages.html Read more about packages].
= Octave User Codes =
There are also User Codes available for GNU Octave which are not part of the core program or any of the packages.
[[:Category:User Codes|See Category User Codes]].


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

Latest revision as of 10:25, 13 January 2023

First, follow the installation instructions for:

or consult the GNU Octave manual to install GNU Octave on your system. Then, start the GNU Octave by clicking the icon in the programs menu or launch the interactive prompt by typing octave in a terminal. See the manual page on running Octave.

The GNU Octave graphical user interface (GUI).

Variable Assignment[edit]

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

a = 1;

Comments[edit]

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

Command evaluation[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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[edit]

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

help plot
doc plot


Octave packages[edit]

Community-developed packages can be added from the Octave Packages website to extend the functionality of Octave’s core library. (Matlab users: Packages act similarly to Matlab’s toolboxes.) The pkg command is used to manage these packages. For example, to use the image processing library visit its page on Octave Packages, copy the install command and run it in octave

pkg install "https://downloads.sourceforge.net/project/octave/Octave%20Forge%20Packages/Individual%20Package%20Releases/image-2.14.0.tar.gz" # install package
pkg load image           # load new functions into workspace

Read more about packages.

Octave User Codes[edit]

There are also User Codes available for GNU Octave which are not part of the core program or any of the packages.

See Category User Codes.