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.