Given the following example:
>> I=[2 1 3;3 2 4]
I =
2 1 3
3 2 4
>> I(:)
ans =
2
3
1
2
3
4
>> I(1:2)
ans =
2 3
Why does I(:)
return a column vector while I(1:2)
returns a shorter row vector?
The (:)
syntax, when used as an index on the right-hand side of an equation, is a special operation that reshapes an entire matrix of any dimension into a single column vector. The following two lines of code therefore give the same result:
a = I(:); % Create a column vector with ":"
a = reshape(I, [], 1); % Create a column vector with RESHAPE
When numerical values are included on either side of a single colon, it denotes a range of linear indices into an array. So I(1:2)
selects the first and second elements from I
(i.e. the values in the first column). One thing to remember is that the syntax 1:2
actually creates a vector [1 2]
, so I(1:2)
is the same as I([1 2])
. Since the linear index [1 2]
is a row vector, the returned values are shaped as a row vector [2 3]
. If you use the index I([1; 2])
or I((1:2).')
, the linear index is a column vector, so the returned values will be shaped as a column vector [2; 3]
.
When you have multiple indices separated by commas, the indices are applied to different dimensions of the matrix being indexed. For example, I(1:2, 1:2)
will return the 2-by-2 matrix [2 1; 3 2]
. The first 1:2
in the index is applied to the rows, so rows one and two are selected. The second 1:2
in the index is applied to the columns, so columns one and two are selected.
The MATLAB documentation describing the colon operator and matrix indexing should help give you a better understanding of how to use :
effectively.