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).

 采纳的回答

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 个评论

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.

请先登录,再进行评论。

更多回答(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.

类别

帮助中心File Exchange 中查找有关 Loops and Conditional Statements 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by