For loop with vertical vs horizontal array

Is the below difference intended functionality or a bug?
x = [1, 2, 3, 4];
for y = x
disp( 'Printing' );
disp( y );
end
Result:
Printing
1
Printing
2
Printing
3
Printing
4
Whereas if I transpose x, the loop only runs once with y = [1; 2; 3; 4].
x = [1, 2, 3, 4]';
for y = x
disp( 'Printing' );
disp( y );
end
Result:
Printing
1
2
3
4
Perhaps I'm being thick, but I can't find this behavior documented anywhere and I would have expected it to loop through the elements in the matrix/array as if it were one dimensional (linear indexing).

 Accepted Answer

I agree it's confusing at first. However it is documented in the "for" section:
for index = valArray
creates a column vector index from subsequent columns of array valArray on each iteration. For example, on the first iteration, index = valArray(:,1). The loop executes for a maximum of n times, where n is the number of columns of valArray, given by numel(valArray, 1, :). The input valArray can be of any MATLAB data type, including a string, cell array, or struct.
In your sexcond case, n is 1 - one column so the loop executes only once. In your first case, n was 4 - four columns so the loop executed 4 times.

5 Comments

Ok, fair enough. I guess no smart way of making sure I get a linear indexing effect regardless of the valArray other than something like:
for index = reshape( 1, numel(valArray) )
in which case I probably prefer:
for i = 1:numel(valArray)
element = vallArray(i)
If you are using indices then use
for index = 1 : numel(valArray)
If you are using array values and do not know the orientation then
for index = valArray(:).'
Thanks, that is much nicer. Is the . in the .' necessary? If so what does it do differently than a simple '
The simple ' is conjugate transpose, in which the signs of the complex part of values are reversed. The .' operator is plain transpose.
got it, thanks

Sign in to comment.

More Answers (1)

It is deliberate behavior.
valarray : creates a column vector index from subsequent columns of array valArray on each iteration. For example, on the first iteration, index = valArray(:,1). The loop executes for a maximum of n times, where n is the number of columns of valArray, given by numel(valArray, 1, :). The input valArray can be of any MATLAB data type, including a string, cell array, or struct.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!