Octave code example

This is one of the simpler code tasks I worked on. I use ‘R’ but since this is Octave my first attempt wasn’t generic. The for loop assumes that there are 2 columns in the matrix shown below. There is a way to modify it to be more generic but this an example to show my Octave skills !!

I have a matrix with 2 columns and a vector which has repeating sets of the numbers 3,2 and 1. The task is to calculate the mean of all values in each column of the matrix rows that are grouped by the numbers 3, 2 and 1. So I decided to add the vector as the 3rd column of the matrix.

Matrix

\begin{pmatrix}      0.5403023 & -0.9576595 \\    -0.4161468 & -0.2751633 \\    -0.9899925 &  0.6603167 \\    -0.6536436 &  0.9887046 \\     0.2836622 &  0.4080821 \\     0.9601703 & -0.5477293 \\     0.7539023 & -0.9999608 \\    -0.1455000 & -0.5328330 \\    -0.9111303 &  0.4241790 \\    -0.8390715 &  0.9912028 \\     0.0044257 &  0.6469193 \\     0.8438540 & -0.2921388 \\     0.9074468 & -0.9626059 \\     0.1367372 & -0.7480575 \\    -0.7596879 &  0.1542514  \end{pmatrix}

Vector

\begin{pmatrix}      2 \\     3 \\     1 \\     2 \\     3 \\     1 \\     2 \\     3 \\     1 \\     2 \\     3 \\     1 \\     2 \\     3 \\     1  \end{pmatrix}

Add the vector as the 3rd column.

centroids = zeros(K, n);%Declare matrix to store the result
X(:,end + 1 ) = idx;

\begin{pmatrix}        0.5403023 & -0.9576595 &  2.0000000 \\    -0.4161468 & -0.2751633 &  3.0000000 \\    -0.9899925 &  0.6603167 &  1.0000000 \\    -0.6536436 &  0.9887046 &  2.0000000 \\     0.2836622 &  0.4080821 &  3.0000000 \\     0.9601703 & -0.5477293 &  1.0000000 \\     0.7539023 & -0.9999608 &  2.0000000 \\    -0.1455000 & -0.5328330 &  3.0000000 \\    -0.9111303 &  0.4241790 &  1.0000000 \\    -0.8390715 &  0.9912028 &  2.0000000 \\     0.0044257 &  0.6469193 &  3.0000000 \\     0.8438540 & -0.2921388 &  1.0000000 \\     0.9074468 & -0.9626059 &  2.0000000 \\     0.1367372 & -0.7480575 &  3.0000000 \\    -0.7596879 &  0.1542514 &  1.0000000 \\  \end{pmatrix}

Find the unique values of the 3rd column. The decimals do not matter here.

uidx = unique(X(:,3),"columns");

Vector with unique elements

\begin{pmatrix}   1 \\  2 \\  3  \end{pmatrix}

I use find to get all the row numbers(j) of the values in the matrix where the 3rd column matches each of the unique values(uidx)

for i = 1:size(uidx,1)
 [j,k]=find(X(:,3) == uidx(i) );
 s = X(j,1);
 t = X(j,2);
 centroids(i,:) = [mean(s);mean(t)]
end

Mean of each column for all the grouped rows

\begin{pmatrix}    -0.171357 &  0.079776 \\     0.141787 & -0.188064 \\    -0.027364 & -0.100211    \end{pmatrix}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: