## Saturday, October 22, 2011

### Octave cheat sheet

I'm mucking about with Octave, MATLAB's open source cousin, as part of Stanford's Machine Learning class. Here are a few crib notes to keep me right side up.

The docs for Octave must be served from a Commodore 64 in Siberia judging by the speed, but Matlab's Function Reference is convenient. The Octave WikiBook covers a lot of the basics.

#### Matrices

Try some matrix operations. Create a 2x3 matrix, and a 3x2 matrix. Multiply them to get a 2x2 matrix. Try indexing.

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

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

>> size(B)
ans =
3   2

>> A * B  % matrix multiplication
ans =
12   12
30   30

>> who    % list variables
A    B    ans

>> A(2,3) % get row 2, column 3
ans =  6

>> A(2,:) % get 2nd row
ans =
4   5   6

>> A'     % A transpose
ans =
1   4
2   5
3   6

>> A' .* B  % element-wise multiply
ans =
2    8
4   10
6   12
```

#### Sum

sum(A,dim) is a little bass-ackwards in that the columns are dimension 1, rows are dimension 2, contrary to R and common sense.

```>> sum(A,2)
ans =
6
15
```

#### Max

The max function operates strangely. There are at least 3 forms of max.

```[C,I] = max(A)
C = max(A,B)
[C,I] = max(A,[],dim)
```

For max(v), if v is a vector, returns the largest element of v. If A is an m x n matrix, max(A) returns a row vector of length n holding the largest element from each column of A. You can also get the indices of the largest values in the I return value.

To get the row maximums, use the third form, with an empty vector as the second parameter. Oddly, setting dim=1 gives you the max of the columns, while dim=2 gives the row maximums.

Perform file operations with Unix shell type commands: pwd, ls, cd. Import and export data, like this:

`>> data = csvread('ex1data1.txt');`
`>> load binary_file.dat`

#### Printing output

The disp function is Octave's word for 'print'.

`disp(sprintf('pi to 5 decimal places: %0.5f', pi))`

#### Histogram

Plot a histogram for some normally distributed random numbers

```>> w = -6 + sqrt(10)*(randn(1,10000))  % (mean = 1, var = 2)
>> hist(w,40)
```

#### Plotting

Plotting

```t = [0:0.01:0.99];
y1 = sin(2*pi*4*t);
plot(t,y1);
y2 = cos(2*pi*2*t);
hold on;         % "hold off" to turn off
plot(t,y2,'r');
xlabel('time');
ylabel('value');
legend('sin','cos');
title('my plot');
print -dpng 'myPlot.png'
close;           % or,  "close all" to close all figs
```

Multiple plots in a grid.

```figure(2), clf;  % select figure 2 and clear it
subplot(1,2,1);  % Divide plot into 1x2 grid, access 1st element
plot(t,y1);
subplot(1,2,2);  % Divide plot into 1x2 grid, access 2nd element
plot(t,y2);
axis([0.5 1 -1 1]);  % change axis scale
```

heatmap

```figure;
imagesc(magic(15)), colorbar```

These crib notes are based on the Octave tutorial from the ml class by Andrew Ng. Also check out the nice and quick Introduction to GNU Octave. I'm also collecting a few notes on matrix arithmetic.

Defining a function

```function ret = test(a)
ret = a + 1;
end
```