More Sub-Indexing

We have seen how one can access a subset of a list by providing a list of desired positions:

>>  A=rand(1,5)
A =
     0.6430    0.5461    0.5027    0.0478    0.2289
>> A([2 3 1 1])
ans =
     0.5461    0.5027    0.6430    0.6430

There are a few more extensions of this:

It can be used to modify part of a matrix:

%with A as before: 
>> A([1 2])=3+A([3 4])
A =
     3.5027    3.0478    0.5027    0.0478    0.2289
%or even:
>> A([3 4])=1
A =
     3.5027    3.0478    1.0000    1.0000    0.2289 

Additionally, this works for matrices and submatrices as well:

>> A=magic(4)
A =
     16      2     3     13
      5     11    10      8
      9      7     6     12
      4     14    15      1
>> A([2 3], [1 4])
ans =
     5     8
     9    12
>> A(1:2,3:4)=1
A =
     16     2     1     1
      5    11     1     1
      9     7     6    12
      4    14    15     1

The keyword end will evaluate to the size of the dimension of the matrix in which it is located:

>> A=magic(4);
>> A(end,end)
ans =
     1
>> A([1 end],[1 end])
ans =
     16    13
      4     1
>> A([1 end/2], [2, end-1])
ans =
      2     3
     11    10
>> A(2,1:end)
ans =
     5    11    10     8
>> A(1:end,3)
ans =
      3
     10
      6
     15
%  1:end is so useful that it has an even shorter notation, :
>> A(:,1)
ans =
     16
      5
      9
      4
>> A(4,:)
ans =
     4    14    15     1

Finally, a matrix can be accessed with a single index (as opposed to with two) and this implies a specific ordering of the elements (rows first, then columns):

>> A(5)
ans =
     2
>> A(4:10)
ans =
     4     2    11     7    14     3    10
>> A(:)
ans =
     16
      5
      4
      2
     11
      7
     14
      3
     10
      6
     15
     13
      8
     12
      1

Exercise 9: Practice some of these methods for accessing matrix elements with the following exercises:

  • Create a matrix of size \(N\times N\) that has ones in the border and zeros inside. For example if \(N=3\) the matrix can be created with
>> A=ones(3,3); A(2,2)=0
A =
     1     1     1
     1     0     1
     1     1     1

Make this construction depend on \(N\) and work for any positive integer \(N\ge2\)

  • Create a 5x5 matrix whose rows are (1:5)
  • Extract the diagonal of a given matrix without using diag (you may use size)
  • Flip a given matrix horiztonally. Vertically? Do not use fliplr or flipud
  • Extract the anti-diagonal of a given matrix
  • Extract the anti-diagonal, without first flipping it (Hint: use single index access)