Introduction to Structs (Data Structures)

Basics

= struct(, , , , ...)
In [1]:
data = struct('x_data', 2, 'y_data', 3)
data =

  scalar structure containing the fields:

    x_data =  2
    y_data =  3

In [2]:
data.x_data
ans =  2

Nesting Structs is OK

In [3]:
trial1 = struct('Name', 'Trial1_23213', 'Time', '2019/01/22', 'Data', struct('x', 2, 'y', 3))
trial1 =

  scalar structure containing the fields:

    Name = Trial1_23213
    Time = 2019/01/22
    Data =

      scalar structure containing the fields:

        x =  2
        y =  3


In [4]:
trial1.Data.x = 17
trial1 =

  scalar structure containing the fields:

    Name = Trial1_23213
    Time = 2019/01/22
    Data =

      scalar structure containing the fields:

        x =  17
        y =  3


In [5]:
trial1.Name = 'Test'
trial1 =

  scalar structure containing the fields:

    Name = Test
    Time = 2019/01/22
    Data =

      scalar structure containing the fields:

        x =  17
        y =  3


Alternative way of declaring Structs

In [6]:
data = struct() % declare empty, add fields later
data =

  scalar structure containing the fields:


In [7]:
data.x = 0:10 % add field dynamically
data =

  scalar structure containing the fields:

    x =

        0    1    2    3    4    5    6    7    8    9   10


In [8]:
data.y = sin(data.x) % add another field dynamically
data =

  scalar structure containing the fields:

    x =

        0    1    2    3    4    5    6    7    8    9   10

    y =

     Columns 1 through 7:

       0.00000   0.84147   0.90930   0.14112  -0.75680  -0.95892  -0.27942

     Columns 8 through 11:

       0.65699   0.98936   0.41212  -0.54402


In [9]:
data
data =

  scalar structure containing the fields:

    x =

        0    1    2    3    4    5    6    7    8    9   10

    y =

     Columns 1 through 7:

       0.00000   0.84147   0.90930   0.14112  -0.75680  -0.95892  -0.27942

     Columns 8 through 11:

       0.65699   0.98936   0.41212  -0.54402


Using a collection of Structs

A "vector" of structs

Field name once, values for that field in a cell arrray.

In [10]:
trials = struct( ...
'Name', {'Trial1', 'Trial2', 'Trial3'}, ...
'XData', {2, 3, 4}, ...
'YData', {2, 5, 7})
trials =

  1x3 struct array containing the fields:

    Name
    XData
    YData

In [11]:
trials(1) % treat like a vector of structures
ans =

  scalar structure containing the fields:

    Name = Trial1
    XData =  2
    YData =  2

Cell array of structs

Just form a cell array from structs.

In [12]:
trial1 = trials(1);
trial2 = trials(2);
trial3 = trials(3);
trials2 = {trial1, trial2, trial3} % treat like a cell array of structures
trials2 =
{
  [1,1] =

    scalar structure containing the fields:

      Name = Trial1
      XData =  2
      YData =  2

  [1,2] =

    scalar structure containing the fields:

      Name = Trial2
      XData =  3
      YData =  5

  [1,3] =

    scalar structure containing the fields:

      Name = Trial3
      XData =  4
      YData =  7

}

In [13]:
trials2{1} % access like a cell array
ans =

  scalar structure containing the fields:

    Name = Trial1
    XData =  2
    YData =  2

Simple Plotting

2D - plot (mainly), scatter, semilogx, semilogy, loglog 3D - surf, countour, countourf, imshow

2D Plotting

single plot

In [14]:
x = 1:10;
y = sin(x);
figure(1); % not necessary, but recommended, be explicit, create figure
plot(x, y); % plots live in a figure
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1a

multiple plots in same figure

In [15]:
x = linspace(0, 10, 100);
y1 = sin(x);
y2 = cos(x);

% by default, plots get overwrittten
figure(2);
plot(x, y1);
hold on; % use after first plot-like command
plot(x, y2);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1a gnuplot_plot_2a

title, axis label, axis range

In [16]:
x = linspace(-5, 5, 100);

%y = sin(x) ./ x;
%or
y = zeros(1, length(x));
for i = 1:length(x)
    y(i) = sin(x(i)) / x(i);
end

figure(3);
plot(x, y);
title('My Plot');
xlabel('Time, t (s)');
ylabel('Values (1)');
xlim([-5, 5]);
ylim([-1, 1]);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 -4 -2 0 2 4 Values (1) Time, t (s) My Plot gnuplot_plot_1a

plot markers

In [17]:
figure(5);
%plot(x, y, 'rx'); % shorthand notation
% full notation
plot(x, y, 'LineStyle', 'none', 'MarkerEdgeColor', 'red', 'Marker', 'x'); 
% scatter(x, y) is plot(x, y, 'o')
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 -6 -4 -2 0 2 4 6 gnuplot_plot_1a
In [18]:
x = linspace(-5, 5, 100);
y = sin(x) ./ x;

% properties can be set via set function
figure(3);
p = plot(x, y);
set(p, 'DisplayName', 'Experiment Data'); % plot label
set(p, 'Marker', 'o');

hold on; % recommended after the first plot in a series

% or via property pairs (name, value) in the call to the function
plot(x, cos(x), 'DisplayName', 'Model Prediction');
plot(x, x.^2 / 16, 'HandleVisibility', 'off'); % to not show a label

% title with a property set
title('My Plot', 'FontSize', 25);

% everything has properties
xl = xlabel('Time, t (s)');
set(xl, 'FontSize', 25);
ylabel('Values (1)', 'FontSize', 25);

% limit the axis range
xlim([-5, 5]);
ylim([-1, 1]);

% don't forget to show labels of plots
legend('show', 'location', 'south');
%legend('Experiment', 'Model'); % alternatively, discouraged
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 -4 -2 0 2 4 Values (1) Time, t (s) My Plot Experiment Data Experiment Data Model Prediction Model Prediction gnuplot_plot_3a

logarithmic axis

In [19]:
x = linspace(0, 10, 100);
y = log(x);

figure(6);
p = plot(x, y);
set(gca, 'XScale', 'log');
% or
% semilogx(x, y)

% create a grid
grid("on");
grid("minor");
warning: axis: omitting non-positive data in log plot
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -3 -2 -1 0 1 2 3 10-1 100 101 gnuplot_plot_1a

subplots

In [20]:
figure(); % request a new figure
subplot(2, 1, 1);
plot(x, sin(x));
subplot(2, 1, 2);
plot(x, cos(x));
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1a -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1b
In [21]:
figure();
subplot(2, 1, 1);
plot(x, sin(x));
subplot(2, 2, 3);
plot(x, cos(x));
subplot(2, 2, 4);
plot(x, -cos(x));
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1a -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1b -1 -0.5 0 0.5 1 0 2 4 6 8 10 gnuplot_plot_1c

histogram

In [22]:
r = rand(1000, 1); % uniform distribution
hist(r, 20); % hist(variable, nb_of_bins)
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 0 10 20 30 40 50 60 0 0.2 0.4 0.6 0.8 1 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a gnuplot_plot_41a
In [23]:
r = randn(1000, 1); % normal (Gaussian) distribution, notice randN
hist(r, 20); % hist(variable, nb_of_bins)
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 0 20 40 60 80 100 120 140 -4 -3 -2 -1 0 1 2 3 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a gnuplot_plot_41a

3D Plotting

In [24]:
% Meshgrid creates pairs for each x and y
x = linspace(-10.0, 1.0, 5)
y = linspace(-2.0, 2.0, 3)
[X, Y] = meshgrid(x, y)
x =

  -10.0000   -7.2500   -4.5000   -1.7500    1.0000

y =

  -2   0   2

X =

  -10.0000   -7.2500   -4.5000   -1.7500    1.0000
  -10.0000   -7.2500   -4.5000   -1.7500    1.0000
  -10.0000   -7.2500   -4.5000   -1.7500    1.0000

Y =

  -2  -2  -2  -2  -2
   0   0   0   0   0
   2   2   2   2   2

In [25]:
f = @(x, y) x.^2 - y.^2;
N = 30;


x = linspace(-2.0, 2.0, N);
y = linspace(-2.0, 2.0, N);
[X, Y] = meshgrid(x, y);


Z = f(X, Y);

figure(1);
surf(X, Y, Z);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a gnuplot_plot_41a gnuplot_plot_42a gnuplot_plot_43a gnuplot_plot_44a gnuplot_plot_45a gnuplot_plot_46a gnuplot_plot_47a gnuplot_plot_48a gnuplot_plot_49a gnuplot_plot_50a gnuplot_plot_51a gnuplot_plot_52a gnuplot_plot_53a gnuplot_plot_54a gnuplot_plot_55a gnuplot_plot_56a gnuplot_plot_57a gnuplot_plot_58a gnuplot_plot_59a gnuplot_plot_60a gnuplot_plot_61a gnuplot_plot_62a -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -4 -3 -2 -1 0 1 2 3 4
In [26]:
figure(2);
contour(X, Y, Z, 20);
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a
In [27]:
figure(3);
contourf(X, Y, Z, 20);
colorbar; % range of Z
Gnuplot Produced by GNUPLOT 5.2 patchlevel 6 gnuplot_plot_1a gnuplot_plot_2a gnuplot_plot_3a gnuplot_plot_4a gnuplot_plot_5a gnuplot_plot_6a gnuplot_plot_7a gnuplot_plot_8a gnuplot_plot_9a gnuplot_plot_10a gnuplot_plot_11a gnuplot_plot_12a gnuplot_plot_13a gnuplot_plot_14a gnuplot_plot_15a gnuplot_plot_16a gnuplot_plot_17a gnuplot_plot_18a gnuplot_plot_19a gnuplot_plot_20a gnuplot_plot_21a gnuplot_plot_22a gnuplot_plot_23a gnuplot_plot_24a gnuplot_plot_25a gnuplot_plot_26a gnuplot_plot_27a gnuplot_plot_28a gnuplot_plot_29a gnuplot_plot_30a gnuplot_plot_31a gnuplot_plot_32a gnuplot_plot_33a gnuplot_plot_34a gnuplot_plot_35a gnuplot_plot_36a gnuplot_plot_37a gnuplot_plot_38a gnuplot_plot_39a gnuplot_plot_40a gnuplot_plot_41a gnuplot_plot_42a gnuplot_plot_43a gnuplot_plot_44a gnuplot_plot_45a gnuplot_plot_46a gnuplot_plot_47a gnuplot_plot_48a gnuplot_plot_49a gnuplot_plot_50a gnuplot_plot_51a gnuplot_plot_52a gnuplot_plot_53a gnuplot_plot_54a gnuplot_plot_55a gnuplot_plot_56a gnuplot_plot_57a gnuplot_plot_58a gnuplot_plot_59a gnuplot_plot_60a gnuplot_plot_61a gnuplot_plot_62a -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 gnuplot_plot_1b -4 -3 -2 -1 0 1 2 3