# Data Types¶

Matlab knows the following data types:

1. Matrices of floating point numbers. Vectors and scalars are special cases.
2. Text strings. These are really vectors of characters to Matlab.
3. Structures.
4. Cell arrays.

Then there are more specialized datatypes such as tables.

You can also define your own data types. We will talk about that more later (see object oriented programming).

The type of a variable is not fixed.

The following is perfectly fine code (and a popular source of errors).

    a = 1;
a = 'a string';


## Vectors¶

To create a vector, simply fill it with values:

    a = [1, 2, 3];
disp(a);
1 2 3


Matlab knows row and column vectors:

    b = [1; 2; 3];
disp(b);
1
2
3
disp(a*b);
14


### The colon operator¶

The colon : makes a vector of sequential numbers:

    disp(1 : 4);
1 2 3 4
% Now with step size 3
disp(1 : 3 : 10);
1 4 7 10


### Indexing¶

To extract elements from a vector, hand it a list (vector) of indices.

>> a = [2, 3, 4, 5];
>> disp(a[1, 3]);
2 4


The vector of indices can be constructed with the colon operator:

    a = 11 : 20;  disp(a(2 : 2 : 6));
12 14 16


Any vector can be used to index elements:

    idxV = [2 5 8];  disp(a(idxV));
12 15 18


Then there is logical indexing.

>> a = 11 : 20; idxV = (a > 15);
>> disp(idxV)
0     0     0     0     0     1     1     1     1     1
>> disp(a(idxV))
16    17    18    19    20


#### Exercises¶

Start with x = 1 : 3 : 30.

1. Find all even elements.
2. Find all elements between 5 and 20.
3. Set all even elements to their negative values.

## Matrices¶

A matrix is an n-dimensional array of numbers. One can also have arrays of other data types (see cell arrays).

To create a matrix, simply fill it with values.

    a = [1 2 3; 4 5 6];  disp(a);
1 2 3
4 5 6


Many commands work directly on matrices.

    a = [1 2 3]; b = [2; 1; 1]; disp(a * b);
7
disp(b * a);
2 4 6
1 2 3
1 2 3


To extract elements:

    c = b*a;  disp(c(1:2, 2:3));
4 6
2 3


To extract all elements:

    disp(c(1,:));
2 4 6


But note: c(:) yields all elements flattened into a vector!

    disp(c(:)');
2 1 1 4 2 2 6 3 3


To extract a list of elements, use sub2ind.

c = [1 2 3; 4 5 6];
idxV = sub2ind(size(c), [1,2], [2,3]);
>> c(idxV)

ans =

2     6

>> disp([c(1,2), c(2,3)])
2     6


### Matrix Pitfalls¶

#### Incorrect Indexing¶

    c = [1 2 3; 4 5 6]; disp(c(5))
3


c(5) should be a syntax error, but instead yields the 5th element of the flattened c(:) matrix!

#### Matrix dimensions change when you add elements.¶

>> x=1;
>> x(2,2) = 2

x =

1     0
0     2


This is a common source of bugs and one of the most counterproductive features of Matlab.

## Multi-dimensional matrices¶

Matlab matrices can have more than 2 dimensions.

    a = rand([3,2,5]);
size(a)
ans =
3     2     5

a(:,:,3)
ans =
0.9218    0.4057
0.7382    0.9355
0.1763    0.9169


Sub-matrices work just like ordinary 2-dimensional matrices.

But: a(:,1,:) is not a 2D matrix. It’s a 3D matrix with a singleton 2nd dimension.

### Matrix Exercises¶

1. Construct a matrix A with elements [2,4,...,20] in row 1 and [1,4,7,...,28] in row 2.
2. Replace row 1 with its square.
3. Find all columns where row 1 > row 2.
4. Let x=ones(10,1). Compute Ax.

## Structures¶

Structures are containers for variables of different types.

They are defined by simply adding element to a blank structure.

### Example:¶

Store the contact information for a person.

    contactS.Name = 'John Doe';
contactS.Age = 37;


The elements are accessed by name:

    disp(contactS.Age);
37


One can have structure arrays, but they are tricky because each element must be a structure with the same fields.

Often, cell arrays are more useful.

### Where structures are useful¶

Use a structure to pass a large number of arguments to a function.

• Example: Set of parameters and prices for solving a household problem.
• Example: Our models store all fixed parameters in a structure that is passed to essentially all functions.

Structures can make code robust against changes.

• Example: Add a preference parameter to the model. Only the household code needs to be changed. Other programs use the same structure to look up model parameters.

## Text Strings¶

To Matlab, a text string is a vector of characters. And a character is represented by a number.

Therefore: most vector operations work on text strings.

Example:

myName = 'Hendricks'; disp(myName(5:8));
rick
disp(myName(5) == 'r');
1


### sprintf¶

sprintf produces formatted text from (usually) numerical inputs.

The syntax is almost the same as in C. Read the manual for details.

Example:

    sprintf('Integer: %i. Float: %5.2f. String: %s', 5, 3.71, 'test')
ans =
Integer: 5. Float: 3.71. String: test


## Cell Arrays¶

A cell array is an n-dimensional array of mixed data.

Each cell can hold a different data type.

>> x = {'abc', 17; [3,4,5], {1, 2}}
x =
'abc'           [      17]
[1x3 double]    {1x2 cell}
>> disp(x{1,1})
abc
>> disp(x{2,1})
3     4     5


Uses:

• most common: replacement for structure array when one is not sure that all elements have the same fields.

## Numeric Precision¶

By default, numeric variables are stored as double (double precision float, 64 bit).

Even if you define x=1, it is a double.

>> x=1;
>> class(x)

ans =

double


If you work with large (simulated) datasets, you may want to store matrices in formats that take less storage.

>> x = ones([1,3], 'uint8')

x =

1    1    1


This leads to some nice opportunities for errors about which Matlab helpfully does not complain (another Matlab bug).

>> x(2)=1e5

x =

1  255    1


The number assigned to x was too large for an 8 bit integer. It gets truncated without warning.

Worse, applying common numeric operations to integers returns integers:

>> y = x/2

y =

1  128    1

>> class(y)

ans =

uint8

Rule of thumb: Store large datsets in low precision. Make everything double the moment you load it.