% The power of Matlab comes from its ability to easily manipulate % two, three, and higher dimensional arrays. In the above example, % neither linspace nor the colon operator, by % themselves, can be used to construct higher dimensional arrays. But the % rand can. For example, % A = rand(3,5) %% % % creates a $3 % \times 5$ array, or an array with 3 rows and 5 columns. %

% We can even construct three dimensional arrays with the rand function: % B = rand(4,2,3) %% Shapes of arrays % % The shape of two dimensional arrays can be % characterized by how many rows and columns it has. For every array % (including scalars, which, in Matlab, are just $1\times 1$ % arrays) Matlab stores its dimensions and its number rows and % columns. To find the shape of an array, we can use the size function. For example, % A = rand(4,3) [r,c] = size(A); fprintf('A has %d rows and %d columns\n',r,c); %% % % Two arrays have the same shape if they have the same number of rows and % columns. %

% If we only ask for one return argument, we will get an array containing % the length of both dimensions. % mn = size(A) %% % % If we ask for the length of an array in which neither dimension is % 1, we will get the length of the largest dimension. This comes in handy % if you know your array has, for example, many more rows than columns (as % if often the case with large data sets) and you simply want to know how % many rows of data you have. % my_data = zeros(237,5); length(my_data) %% % % In Matlab, even string variables have a length. For example, % s = 'Hello, World'; length(s) %% Indexing two dimensional arrays % % We have already seen how we can retrieve a single entry in a % one-dimensional array. We simply use the parenthesis operator () with an argument indicating the entry we want. % v = (1:10).^2 %% % % Retrieve the second entry in v % v(2) %% % % Retrieving a single entry from a two dimensional array uses the () operator as well, but this time with two arguments, % the desired row and column index. % A = magic(4) % Create a 4x4 magic square %% % % Retrieve the entry in the first row, second column % A(1,2) %% A(3,4) %% A(2,3) %% % % As with one dimensional arrays, we can also retrieve multiple entries in % a two dimensional array at once. For example, to get the second row of % the array A above, we use the : operator. % A(2,:) %% % % The third column is obtained in analogous fashion: % A(:,3) %% % To obtain rows 1 and 3 at the same time, we can use integer arrays in % exactly the same way that we used them in the vector case. A([1 3],:) %% % To retrieve columns 2 and 3, we do the following A(:,[2 3]) %% % % And finally, if we want the last column or row, we use the end keyword. The last column of A is % A(:,end) %% % and the last row is A(end,:) %% % % The : operator by itself, when used in arrays % can be used to retrieve the entire array as one long vector. When used % with row vectors, it has the additional effect of converting the array to % a column vector. % A(:) %% v(:) %% % % Suppose we really wanted to see if A is a magic % square. We need to see if the rows and columns each add up to the same % number. There are many ways to do this in Matlab, but here, we will use % a single for loop. % for i = 1:4, % sum over rows row_sum(i) = sum(A(i,:)); end for j = 1:4, % Sum over columns col_sum(j) = sum(A(:,j)); end %% % Row sum : row_sum %% % Column sum : col_sum %% % % The row sums and the column sums are equal, so A % is a magic square. % %% Assigning values to arrays % % We use array indexing to not only select values from an array, but also % to assign particular values to an array. For example, we can create an % $4\times 3$ array of all 1s and then % reassign the third row to contain values [1,2,3] % X = ones(4,3) %% X(3,:) = -rand(1,3) %% % % The array on the right hand side should have the same shape as the array % array indexed on the left hand side. In the above example, the use of % the ': allows us to specify all the columns. % The array on the left hand side, then should have the same number of % columns as those in the array X. %

% Here is an example in which we re-assign the 'interior' entries of an % array the value 7. % A = zeros(5,5) %% A([2:4],[2:4]) = 7 %% % % We can assign the 'exterior' values of the array to a different value, % but this will require two steps. First, we assign the first and last % columns the value -3. % A(:,[1 end]) = -3 %% % % And then we assign the top and bottom rows the same value. % A([1 end],:) = -3 %% % % There are many instances in which we need to use arrays to store values, % say from an iterative calculation that we are doing. In this case, we might use a % for loop. The following simple example shows % how we might use the series approximation to the function $\sin(x)$ to approximate the sine function. % $$ % \sin(x) = \sum_{i=0}^{\infty} \frac{(-1)^{i} x^{2i+1}}{(2i+1)!} % $$ % We can show how the approximations get closer and closer to our % desired value, and plot the convergence of the sum. % sinx = 0; x = 1.2; for i = 0:10, n = 2*i+1; sinx = sinx + (-1)^i*x^n/factorial(n); approx(i+1,:) = [i sinx abs(sinx-sin(x))]; end %% format long e approx %% Array concatenation for two dimensional arrays. % % We already had a simple introduction to array concatenation for % one-dimensional arrays. Now let's extend this idea to two dimensional % arrays. First, it will be convenient to use the square brackets to build % column vectors as well as row vectors. We have already seen that % v = [1,2,3] %% % % builds a row vector. % Using [] in a similar fashion, we can also % create a column vector. This time, however, we must separate each entry % by a semi-colon (;) to indicate that we want to % "stack" the numbers on top of each other. % v = [1;2;3] %% % % In Matlab, this way building of arrays from existing components (numbers, in % this case), is called "concatenation". Concatenation can either be done % horizontally (as was done in the first example above) or vertically (as % in the second example). %

% This idea of array concatenation extends naturally to situations where % the components are not just numbers, but are themselves arrays. For % example, suppose we wanted to build an array by stacking existing row % vectors on top of each other. This can easily be done using vertical % concatenation. % % Three row vectors a = [1,2,3]; b = [4,5,6]; c = [7,8,9]; % Build A by vertical concatenation A = [a; b; c] %% % % In a similar fashion, we can build an array from existing column vectors. % % Three column vectors a = [1; 2; 3]; b = [4; 5; 6]; c = [7; 8; 9]; % Build A using horizontal concatenation A = [a b c] %% % % Of course, array concatenation can fail if you try to stack arrays that % are not "conformable", i.e. their sizes don't match. Try the following : % % % %

% A = [1; [2 3]] %%

```
% Error using lab_5 (line 315)
% Error using vertcat
% CAT arguments dimensions are not consistent.
%
```

%
%%
%
% In this case, we are trying to stack a single number on top of a 1x2 row
% vector. The number of columns in the components we are trying to stack
% do not match, and Matlab complains.
%
%
%
% The following, however, works
%
A = [1 [2 3]]
%%
%
% We can always horizontally concatenate two row vectors of different sizes.
%
%% Loading data files
%
% Often, data will be stored in a local file on your harddrive. You can
% construct an array from this file by simply loading this file into Matlab
% using the load command. For example, suppose we
% have the file % A = load('my_data.dat'); %%

The array A will then have the same number % of rows and columns as the file. For example, suppose that the file % 'A.dat' looks like this %

% % File A.dat % 3.4 5.6 % 4.7 8.9 % -5.1 6.7 % -2.1 5.6 %%

Then, we can load the file and assign the results to the variable A. % A = load('A.dat') %% % % The file name and the variable name do not have to match. Also, comments % can be included in data files in the same way that they can be included % in m-files. % %% Lab exercises % %

% Construct the arrays described below, using Matlab functions, array assignment, or
% array concatenation.
%

% -
%
- A $10\times1$ array of all 1s. %
- A $2\times 9$ array in which the entries in the % first row are all equal to $\pi$ and the % entries in the second row are all equal to $e$. %
- A $5\times3$ array of random numbers. %
- A $5\times3$ array of random numbers between -1 and 1. %
- A $3\times4$ array of all 1s, with the % exception of the second row, which has been replaced by a row of -4s. %
- A $7\times5$ array, in % which the first 6 rows are random numbers between -1 and 1, and the % last row is chosen so that the sum of all the rows is exactly a row of 0s. %
- A $10\times 10$ array with 1s % in the first columm, 2s in the second column, 3s in the third column and so on. %
- A $7\times7$ array in which the % outer 'layer' of values is 0, the next layer is all 1s, and the innermost % entry is 3. %

%

% Using a for loop, demonstrate the convergence of
% the series expansions of the following functions. Evaluate each function
% at the indicated value.
%

%
%%
%
% -
%
- $$\cos(x) = % \sum_{n=0}^{\infty}\frac{(-1)^{n}x^{2n}}{(2n)!}$$ at $x=5.4$. %
- $$\exp(x) = \sum_{n=0}^{\infty} % \frac{x^n}{n!}$$ at $x=0.2$. %
- $$\ln(1+x) = \sum_{n=0}^{\infty} % \frac{(-1)^{n-1}x^n}{n}$$ at $x=-0.5$. %

Compare your answers with the solutions.

%