Simple Matlab/Octave tips

How do I extract elements from a matrix, based on a boolean criterion?

:?: I have a 20×2 matrix, i.e. a matrix with 20 lines and two columns. I would like to extract all those lines for which the second element (the one in the second column) is smaller than 0.5.

:!: We will do this one the real Matlab way, in array-based formulation and without loops. It's faster, it's shorter, it's nicer and it's the Matlab way of doing things. First, let us create a 2×20 Matlab matrix, filled with random numbers, to illustrate the procedure: a = rand(2,20). The next step consists in constructing a matrix that acts as a mask for the boolean condition “second element is smaller than 0.5”. Here you go: mask = a(:,2)<0.5. We finally extract all lines from a for which the mask yields 1 (which means, true): a_extract = a(mask,:). Alternatively, taking everything on one line, we have

a_extract = a(a(:,2)<0.5,:);

:!: There are fundamentally two strategies for extracting a sub-matrix from some initial matrix. The first is to use a vector containing the sub-indices to extract along every space direction (or the joker : to keep all indices). The second, to apply a boolean (in Matlab terminology, a logical) matrix as a mask. The following code snippet illustrates both approaches:

a = rand(2,20);                          % create a 2x20 matrix
b = a([2,4,5],:);                        % extract lines 2,4 and 5 using sub-indices
b = a(logical[(0,1,0,1,1,0,0,0,0,0)],:); % extract lines 2,4 and 5 using a boolean mask

How do I plot data produced by some other program in Matlab?

:?: The result from some of my simulations is a (scalar) velocity field which I'd like to plot with Matlab, as a figure with pixels whos color represents the value of the scalar to be plotted.

:!: For small data sets, you may want to avoid incompatibilities between operating systems and processors by storing the data in a text file. Forget about the dimensions of your matrix and write the data in a single row, one element per line. This strategy then works also for matrices that have more than two dimensions. For example, let's say you want to save a matrix whos content, in Matlab notation, is [0.1, 0.2, 0.3; 1, 2, 3]. To save this one, open a text file my_matrix.dat and fill it with the following content:


Then, load the matrix into Matlab space, reshape it properly and plot it:

load my_matrix.dat                   % by default, the name of the variable is "my_matrix"
my_matrix = reshape(my_matrix,2,3);  % restore the correct shape
imagesc(my_matrix);                  % plot the matrix, use a color scheme that is rescaled
                                     % to the actual values of the matrix
colormap(hot);                       % use a nice color map

Is there a free version of Matlab?

No, there isn't. There are however some free software packages with similar functionalities. You might want to have a look at Octave, which supports the same syntax as Matlab to a large extent.