GNU Octave Basics Notes

14 August 2020

gnu octave logo

Change prompt

from octave:1> to >>

octave:1> PS1('>> ');
>> 

Help command

>> help help
'help' is a function from the file C:\Octave\OCTAVE~1.0\mingw64\share\octave\5.2.0\m\help\help.m

 -- help NAME
 -- help --list
 -- help .
 -- help
     Display the help text for NAME.

     For example, the command 'help help' prints a short message
     describing the 'help' command.

     Given the single argument '--list', list all operators, keywords,
     built-in functions, and loadable functions available in the current
     session of Octave.

     Given the single argument '.', list all operators available in the
     current session of Octave.

     If invoked without any arguments, 'help' displays instructions on
     how to access help from the command line.

     The help command can provide information about most operators, but
     NAME must be enclosed by single or double quotes to prevent the
     Octave interpreter from acting on NAME.  For example, 'help "+"'
     displays help on the addition operator.

     See also: doc, lookfor, which, info.

Additional help for built-in functions and operators is
available in the online version of the manual.  Use the command
'doc <topic>' to search the manual index.

Help and information about Octave is also available on the WWW
at https://www.octave.org and via the help@octave.org
mailing list.

Basic Operations

Math Operations

Addition

>> 5+6
ans = 11

Subtraction

>> 3-2
ans = 1

Multiplication

>> 5*8
ans = 40

Division

>> 1/2
ans = 0.50000

Exponent

>> 2^6
ans = 64

Logic operations

Equality

>> 1 == 2
ans = 0

Inequality

>> 1 ~= 2
ans = 1

Logical AND

>> 1 && 0
ans = 0

Logical OR

>> 1 || 0
ans = 1

Logical XOR

>> xor(1,0)
ans = 1 

Variables

Assignments

numbers

>> a =3;
>> a
a = 3

strings

>> b = 'hi';
>> b
b = 'hi'

calculations

>> c = (3>=1);
>> c
c = 1

π\pi

>> a = pi;
>> a
>> a = 3.1416

Displaying Variables

numbers

>> a = pi;
>> disp(a)
3.1416

strings

>> a = pi;
>> disp(sprintf('2 decimals: %0.2f', a));
2 decimals: 3.14
>> disp(sprintf('6 decimals: %0.6f', a));
6 decimals: 3.141593

format

>> a = pi;
>> format long
>> a
a = 3.14159165358979
>> format short
>> a
a = 3.1416

Matrices

3x2 matrix

>> A = [1 2; 3 4; 5 6]
A = 
    1   2
    3   4
    5   6

or

>> A = [1 2;
> 3 4;
> 5 6]
A = 
    1   2
    3   4
    5   6

1x3 Matrix

>> V = [1 2 3 ]
V =
    1   2   3

3x1 Vector

>> V = [1; 2; 3;]
V =
    1
    2
    3

Creating vector from 1 to 2 increasing next element by 0.1

>> V = 1:0.1:2
V =
    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000

Creating vector from 1 to 6 increasing next element by 1

>> V = 1:6
V =
    1   2   3   4   5   6

Matrix 2x3 with all values eqauls 1

>> ones(2,3)
ans = 
    1   1   1
    1   1   1

Matrix 2x3 with all values eqauls 2

>> C = 2*ones(2,3)
C = 
    2   2   2
    2   2   2

Row vector with 1

>> w = ones(1,3)
w = 
    1   1   1

Row vector with 0

>> w = zeros(1,3)
w = 
    0   0   0

Random matrix (numbers between 0 and 1)

>> rand(1,3)
ans =
   0.32784   0.49321   0.17449
>> rand(3,3)
ans =
   0.60369   0.15891   0.75957
   0.47148   0.11786   0.86370
   0.46272   0.51486   0.71124

Gaussian random variables

>> randn(1,3)
ans =
  -0.67605  -0.54028   0.42763

More complicated

>> w = -6 + sqrt(10)*randn(1,100)
w =
 Columns 1 through 8:
   -4.5865653   -8.8356479   -8.1333614   -2.3439273   -7.3621630   -9.0450181   -2.1489934   -4.2785162
 Columns 9 through 16:
  -10.7109066   -7.5124041   -6.6674847  -14.4887638   -0.4808289   -2.1354753   -7.8977581   -8.9314986
 Columns 17 through 24:
   -8.9893458   -1.5510572  -10.3796268  -10.2004881   -1.9258233  -10.7401729   -1.4114864  -11.9918739
 Columns 25 through 32:
   -1.4288672   -9.1350859   -4.0339111   -7.1057222   -5.5066692   -5.3943613   -9.9372854  -12.3273985
 Columns 33 through 40:
   -9.1448272   -3.5632437   -9.8825123   -3.6862963   -0.9314631   -7.1585643   -7.5249914   -6.7338681
 Columns 41 through 48:
   -4.0692604   -3.1736484   -7.1340077   -5.6141781   -7.1375287  -10.1554003   -7.3884758   -8.2993959
 Columns 49 through 56:
   -7.9971092   -3.7486347   -4.9565946  -10.1077235   -3.7186839   -7.6239998   -9.3567788   -7.0285528
 Columns 57 through 64:
   -5.7498064   -5.1235503    2.6385315   -7.0795552   -5.1845500   -2.7447164   -7.7785950    0.8816560
 Columns 65 through 72:
   -6.5335031    0.0066014   -3.9586199   -2.1445580   -3.4484948  -12.8979017   -1.5233025   -4.4102424
 Columns 73 through 80:
    0.9831482   -4.7574813   -2.7595514  -11.2178766   -5.3229671   -1.8543523   -3.7577500   -3.8678680
 Columns 81 through 88:
   -3.8637871   -7.2037168  -11.7877396   -7.1542280   -7.5999564    0.2206099   -6.7140798   -1.3302397
 Columns 89 through 96:
   -3.6058713   -5.5103303   -5.8951690   -1.6396029   -8.2389941   -4.5821969   -4.4162341   -6.9883700
 Columns 97 through 100:
   -3.4562746   -3.8389149   -0.8080181   -4.6449049

Histagram

>> hist(w)

histagram

>> hist(w,50)

hist50

>> eye(4)
ans =
Diagonal Matrix
   1   0   0   0
   0   1   0   0
   0   0   1   0
   0   0   0   1

Moving Data Around

Matrices size

>> A = [1 2; 3 4; 5 6]
A =
   1   2
   3   4
   5   6

>> size(A)
ans =
   3   2

Get dimensions (rows) of Matrix

>> size(A,1)
ans =  3

Get number of columns

>> size(A,2)
ans =  2

Length of Vector

V =
   4   3   1   5
>> length(V)
ans =  4

It can be applied as well to Matrices, but then the result will be only for the longest dimension

>> length(A)
ans =  3

Loading data

Show the current directory

>> pwd
ans = C:\Users\Gosia

Changing directory

>> cd 'D:\Projects'
>> pwd
ans = D:\Projects

Load data

>> load data.txt

display data from the file

>> data
data =
    6.11010   17.59200
    5.52770    9.13020
    8.51860   13.66200
    7.00320   11.85400
    5.85980    6.82330
    8.38290   11.88600
    7.47640    4.34830
    8.57810   12.00000
    6.48620    6.59870
    5.05460    3.81660
    5.71070    3.25220
   14.16400   15.50500
    5.73400    3.15510
    8.40840    7.22580
    5.64070    0.71618
    5.37940    3.51290
    6.36540    5.30480
    5.13010    0.56077
    6.42960    3.65180
    7.07080    5.38930
    6.18910    3.13860

check the size of data (file)

>> size(data)
ans =
   97    2

check variables that Octave has in memory

>> who
Variables in the current scope:
A     V     a     ans   b     c     data  w

check variables with details that Octave has in memory

>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        A           3x2                         48  double
        V           1x4                         32  double
        a           1x1                          8  double
        ans         1x2                         16  double
        b           1x2                          2  char
        c           1x1                          1  logical
        data       97x2                       1552  double
        w           1x100                      800  double

Total is 310 elements using 2459 bytes

assign only selected data from one variable to another

>> m = data(1:10)
m =

   6.1101   5.5277   8.5186   7.0032   5.8598   8.3829   7.4764   8.5781   6.4862   5.0546

>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        A           3x2                         48  double
        V           1x4                         32  double
        a           1x1                          8  double
        ans         1x2                         16  double
        b           1x2                          2  char
        c           1x1                          1  logical
        data       97x2                       1552  double
        m           1x10                        80  double
        w           1x100                      800  double

Total is 320 elements using 2539 bytes

save a variable to a file (in binary format)

>> save hello.mat m;
>> ls
 Volume in drive D is Data
 Volume Serial Number is 9C15-10B4

 Directory of D:\machine-learning-ex\test

[.]         [..]        data.txt    hello.mat
               2 File(s)          1,691 bytes
               2 Dir(s)  88,129,142,784 bytes free

save a variable to a file (in ascii format)

>> save hello.txt m -ascii

hello.txt

 6.11010000e+00 5.52770000e+00 8.51860000e+00 7.00320000e+00 5.85980000e+00 8.38290000e+00 7.47640000e+00 8.57810000e+00 6.48620000e+00 5.05460000e+00

clear selected variable

>> clear data
>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        A           3x2                         48  double
        V           1x4                         32  double
        a           1x1                          8  double
        ans         1x2                         16  double
        b           1x2                          2  char
        c           1x1                          1  logical
        w           1x100                      800  double

Total is 116 elements using 907 bytes

clear all variables

>> clear
>> whos
>>

loading saved variable

>> load hello.mat
>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        m           1x10                        80  double

Total is 10 elements using 80 bytes

Get specific element from the variable (example: 3rd column and 2nd row)

>> A=[1 2; 3 4; 5 6]
A =

   1   2
   3   4
   5   6

>> A(3,2)
ans =  6

Get everything in a second row

>> A(2,:)
ans =
   3   4

Get everything in a second column

>> A(:,2)
ans =

   2
   4
   6

Get all elements from specific columns

>> A([1 3],:)
ans =

   1   2
   5   6

>> A([2 3],:)
ans =

   3   4
   5   6

>> A([1 2 3],:)
ans =

   1   2
   3   4
   5   6

Change data in matrix

>> A
A =

   1   2
   3   4
   5   6

>> A(:,2) = [10;11;12]
A =

    1   10
    3   11
    5   12

Add (append) another column vector data to the right

>> A = [A, [100; 101; 102]];
>> A
A =

     1    10   100
     3    11   101
     5    12   102

Put all element of matrix into single column vector

>> A(:)
ans =

     1
     3
     5
    10
    11
    12
   100
   101
   102

Combine two matrices

>> A = [1 2; 3 4; 5 6];
>> B = [11 12; 13 14; 15 16];
>> C = [A B]
C =

    1    2   11   12
    3    4   13   14
    5    6   15   16

or

>> A = [1 2; 3 4; 5 6];
>> B = [11 12; 13 14; 15 16];
>> C = [A; B]
C =

    1    2
    3    4
    5    6
   11   12
   13   14
   15   16

Computing on Data

Multiply

>> A = [1 2; 3 4; 5 6];
>> C = [1 1; 2 2];
>> A*C
ans =

    5    5
   11   11
   17   17

Element-wise multiplication

>> A = [1 2; 3 4; 5 6];
>> B = [11 12; 13 14; 15 16];
>> A .*B
ans =

   11   24
   39   56
   75   96

Element-wise squaring

>> A = [1 2; 3 4; 5 6];
>> A .^ 2
ans =

    1    4
    9   16
   25   36

Element-wise Reciprocal

>> V = [1; 2; 3];
>> 1 ./ V
ans =

   1.00000
   0.50000
   0.33333

Element-wise inverse of A (matrix)

>> A = [1 2; 3 4; 5 6];
>> 1 ./A
ans =

   1.00000   0.50000
   0.33333   0.25000
   0.20000   0.16667

Element-wise logarithm

>> V = [1; 2; 3];
>> log(V)
ans =

   0.00000
   0.69315
   1.09861

Exponentiation

>> V = [1; 2; 3];
>> exp(V)
ans =

    2.7183
    7.3891
   20.0855

Element-wise absolute value

>> V = [1; 2; 3];
>> abs(V)
ans =

   1
   2
   3

>> abs([-1; -3; -10])
ans =

    1
    3
   10

negative

>> V = [1; 2; 3];
>> -V
ans =

  -1
  -2
  -3

or

>> V = [1; 2; 3];
>> -1*V
ans =

  -1
  -2
  -3

Increment all values by one

>> V = [1; 2; 3];
>> V + ones(length(V),1)
ans =

   2
   3
   4

or

>> V = [1; 2; 3];
>> V + 1
ans =

   2
   3
   4

Matrix transport

>> A = [1 2; 3 4; 5 6];
>> A'
ans =

   1   3   5
   2   4   6

Max value

>> a = [1 15 2 0.5];
>> max(a)
ans =  15

Max value and index of this max value

>> val = max(a)
val =  15
>> [val, ind] = max(a)
val =  15
ind =  2

Column-wise maximum (on matrices)

>> A = [1 2; 3 4; 5 6];
>> max(A)
ans =

   5   6

or

>> A = [1 2; 3 4; 5 6];
>> max(A,[],1)
ans =

   5   6

Row-wise maximum (on matrices)

>> A = [1 2; 3 4; 5 6];
>> max(A,[],2)
ans =

   2
   4
   6

The max element in whole matrix

>> A = [1 2; 3 4; 5 6];
>> max(max(A))
ans =  6

or turn into vector

>> A = [1 2; 3 4; 5 6];
>> max(A(:))
ans =  6

Element-wise comparison (showing true/false)

>> a = [1 15 2 0.5];
>> a < 3
ans =

  1  0  1  1

Element-wise comparison (showing with element)

>> a = [1 15 2 0.5];
>> find(a < 3)
ans =

   1   3   4

Magic (N-by-N magic square)

>> A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2
>> A = magic(9)
A =

   47   58   69   80    1   12   23   34   45
   57   68   79    9   11   22   33   44   46
   67   78    8   10   21   32   43   54   56
   77    7   18   20   31   42   53   55   66
    6   17   19   30   41   52   63   65   76
   16   27   29   40   51   62   64   75    5
   26   28   39   50   61   72   74    4   15
   36   38   49   60   71   73    3   14   25
   37   48   59   70   81    2   13   24   35

sum columns

>> sum(A,1)
ans =

   369   369   369   369   369   369   369   369   369

sum rows

>> sum(A,2)
ans =

   369
   369
   369
   369
   369
   369
   369
   369
   369

sum diagonal

>> eye(9)
ans =

Diagonal Matrix

   1   0   0   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0
   0   0   1   0   0   0   0   0   0
   0   0   0   1   0   0   0   0   0
   0   0   0   0   1   0   0   0   0
   0   0   0   0   0   1   0   0   0
   0   0   0   0   0   0   1   0   0
   0   0   0   0   0   0   0   1   0
   0   0   0   0   0   0   0   0   1


>> A .* eye(9)
ans =

   47    0    0    0    0    0    0    0    0
    0   68    0    0    0    0    0    0    0
    0    0    8    0    0    0    0    0    0
    0    0    0   20    0    0    0    0    0
    0    0    0    0   41    0    0    0    0
    0    0    0    0    0   62    0    0    0
    0    0    0    0    0    0   74    0    0
    0    0    0    0    0    0    0   14    0
    0    0    0    0    0    0    0    0   35

>> sum(sum(A.*eye(9)))
ans =  369

>> flipud(eye(9))
ans =

Permutation Matrix

   0   0   0   0   0   0   0   0   1
   0   0   0   0   0   0   0   1   0
   0   0   0   0   0   0   1   0   0
   0   0   0   0   0   1   0   0   0
   0   0   0   0   1   0   0   0   0
   0   0   0   1   0   0   0   0   0
   0   0   1   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0
   1   0   0   0   0   0   0   0   0

>> sum(sum(A.*flipud(eye(9))))
ans =  369

finding by row and column

>> A = magic(3);
>> [r,c] = find(A >= 7)
r =

   1
   3
   2

c =

   1
   2
   3
  
>> [row,column] = find(A >= 7)
row =

   1
   3
   2

column =

   1
   2
   3

Pseudo-inverse

>> A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2

>> pinv(A)
ans =

   0.147222  -0.144444   0.063889
  -0.061111   0.022222   0.105556
  -0.019444   0.188889  -0.102778

Add all elements

>> a = [1 15 2 0.5];
>> sum(a)
ans =  18.500

Multiply all elements

>> a = [1 15 2 0.5];
>> prod(a)
ans =  15

Rounds down elements ( Return the largest integer not greater than X)

>> a = [1 15 2 0.5];
>> floor(a)
ans =

    1   15    2    0

Rounds up elements ( Return the smallest integer not less than X)

>> a = [1 15 2 0.5];
>> ceil(a)
ans =

    1   15    2    1

Plotting Data

Sample generated data for the plot (numbers from 0 to up 0.98) and sin function

>> t=[0:0.01:0.98];
>> y1 = sin(2*pi*4*t);

Generating plot, where horizontal axis = t and verical axis = y1:

>> plot(t,y1);

plot01 sin

When run once again the plot with different argument, it will be replaced with new plot:

>> y2 = cos(2*pi*4*t);
>> plot(t,y2);

plot02 cos To have both (or more) plots on one designer it's needed to use the hold on; function:

>> plot(t,y1);
>> hold on;
>> plot(t,y2);

plot03 sincos

Adding labels, legend and title

>> xlabel('time');
>> ylabel('value');
>> legend('sin','cos');
>> title('my plot');

plot04 extrainfo

Saving the figure

>> cd D:\; print -dpng 'myPlot.png'

myPlot

To close figure

>> close;

To open two figures in seperate windows:

>> figure(1); plot(t,y1);
>> figure(2); plot(t,y2);

plot05 figureNumber

Dividing plot by 1x2 grid and access first element and next second element

>> subplot(1,2,1);
>> plot(t,y1);

plot06 grid

Clear figure

>> clf;

Visualize matrix

>> A = magic(5)
A =

   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9

>> imagesc(A)

magicMatrix

To show with grey colour with colour bar

>> imagesc(A), colorbar, colormap gray;

magicMatrix gray