GNU Octave is a really neat prototyping language for machine learning tasks. It is dynamically typed.

## Installation

Octave is in the package repositories, so it can be installed by

```
$ sudo apt-get install octave gnuplot-x11 octave-epstk
```

and started with

```
$ octave
```

## Configuration

Create a file `~/.octaverc`

in your home folder. Write

```
PS1('>>');
setenv("GNUTERM","x11");
```

in it to get a nicer prompt and make sure that plots will work.

## The Language

### Vectors and Matrices

Octave has a lot of neat matrix manipulation features. You can create a matrix \(A =

```
>> A = [1 2; 3 4];
```

When you want to transpose a vector / a matrix, you simply add an apostrophe:

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

You can multiply two matrices with `A*B`

or use the dot product with `A .* B`

.

The identity matrix \(I \in \mathbb{R}^{n \times n}\) can be created with

```
>> I = eye(n);
```

You can get a part of the matrix by slicing:

```
>> I = eye(n);
>> I(:, 1:2);
```

But be careful: Vectors and matrices are 1-indexed, not 0-indexed as you might expect!

You can get the size of a matrix with the function `size`

which returns a matrix:

```
>> a = [1 2 3; 4 5 6];
>> size(a)
ans =
2 3
```

If you simple want the "length" you can directly access the first element:

```
>> size(a)(1)
ans = 2
```

### Sequences

The sequence `0 1 2 3 4 5`

can be created with `[0:5]`

.

The sequence `0.2 0.3 0.4 0.5`

can be created with `[0.2:0.1:0.5]`

.
In general: `[<start>:<step>:<end>]`

where `<start>`

and `<end>`

are included.

You can also very simple apply functions to each element:

```
>> t = [0.2:0.1:0.5];
>> sin(t)
ans =
0.19867 0.29552 0.38942 0.47943
```

The output can be suppressed with `;`

.

### Plotting

I have never seen a language where plotting is so easy:

```
>> x = [0:0.01:pi];
>> y = sin(x);
>> plot(x, y);
```

You can add labels and a legend to it, too:

```
>> xlabel = "x";
>> ylabel = "value";
>> legend('sin', 'cos')
>> title("sin and cos")
```

And finally, you can store the image:

```
print -dpng 'my_plot.png'
```

### Control statements

#### for

```
for i=1:10;
printf("%i: %i\n", i, i^2)
end
```

#### while

```
i=1;
while i <= 10,
printf("%i: %i\n", i, i^2)
end;
```

#### if

```
if 2 == 1+1,
printf("True\n");
elseif 3 == 2+1,
printf("Else true");
else
printf("else");
end;
```

### Functions

Functions have to be saved in a file called `[filename].m`

. One other special
thing about functions is that you define the variable with the output at the
beginning:

```
function y = fibonacci(n)
if n < 2,
y = 1;
else
y = fibonacci(n-1) + fibonacci(n-2);
end;
```

You can also group values you want to give back like this:

```
function [succ, pred] = succ_and_pred(n)
succ = n+1;
pred = n-1;
```