Understanding the function surf() in Octave/MATLAB

I’ve been studying Machine Learning for a few days now, on Coursera. After finishing 1st and 2nd weeks, I’ve got the first assignment for the course where you are supposed to implement Linear Regression using Gradient Descent.

While trying to do the assignment, I’ve come across with a function, surf(), for which I’ve struggled a few hours a little bit to understand.

What was confusing for me in the assignment was this line below:

Because of the way meshgrids work in the surf() command, we need to transpose J_vals before calling surf, or else the axes will be flipped. J_vals = J_vals';

I couldn’t get that at first glance, so I’ve started fiddling with the function and plots until a few hours later I’ve found this explanation from the docs1.

If x and y are vectors, then a typical vertex is (x(j), y(i), z(i,j)). Thus, columns of z correspond to different x values and rows of z correspond to different y values.

Take home message: Always check for the docs FIRST. ¯_(ツ)_/¯

Anyway, to visualize this I’ve plotted a graph using the code below:

A = [1 2 3 4 5 6];
B = [7 8 9 10 11 12];
C = magic(6);

% Matrix C:
% 35  1   6   26   19   24
% 3   32  7   21   23   25
% 31  9   2   22   27   20
% 8   28  33  17   10   15
% 30  5   34  12   14   16
% 4   36  29  13   18   11

surf(A, B, C)
scrollTop clientHeight scrollHeight

By the way, I should mention that in the assignment we were assigning the elements of the matrix C (which corresponds to J_vals in the snippet below) like:

% theta0_vals is a 1x100 row vector, which in our case is the matrix A
% theta1_vals is a 1x100 row vector, which in our case is the matrix B
for i = 1:length(theta0_vals)
    for j = 1:length(theta1_vals)
	  t = [theta0_vals(i); theta1_vals(j)];
	  J_vals(i,j) = computeCost(X, y, t);

In the above code, we are assigning the result of the computation from Ai and Bj to Ci,j.

So you can think of it as Ci,j = (Ai, Bj).

Considering the explanation above, after using surf(A, B, C) you might think that C(A(1), B(3)) which is C(1,9) should be equal to C1,3 which is 6.

But as you can see from the above surface plot, the point (1, 9) maps to 31 or you can use interp2(A, B, C, 1, 9) which will give you the same result.

Hence, we take the transpose of the matrix C:

surf(A, B, C')

to get :

scrollTop clientHeight scrollHeight