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

 採用された回答

Image Analyst
Image Analyst 2012 年 12 月 11 日

0 投票

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 件のコメント

Chris
Chris 2012 年 12 月 11 日
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)
Walter Roberson
Walter Roberson 2012 年 12 月 11 日
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(:).'
Chris
Chris 2012 年 12 月 11 日
Thanks, that is much nicer. Is the . in the .' necessary? If so what does it do differently than a simple '
Walter Roberson
Walter Roberson 2012 年 12 月 11 日
The simple ' is conjugate transpose, in which the signs of the complex part of values are reversed. The .' operator is plain transpose.
Chris
Chris 2012 年 12 月 11 日
got it, thanks

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2012 年 12 月 11 日

0 投票

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 ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by