For cycle to extract row of an Array and save them into vectors

6 views (last 30 days)
Hello All, need some help with the following. I have an Array (4x4 cell), cal it A, and I need to create a "for" cycle that allows me to extract and save each row to a single vector. Ideally in this case the resulting vectors would be r1, r2, r3, r4. Sizes of all the vectors would of course be [1 4]. Thanks!
  3 Comments
Guillaume
Guillaume on 17 Dec 2015
"it's hard not to want to go through the dynamic naming of variables route". Actually, I think it's much more work to got the dynamic route. Compare:
%with dynamic names
a = magic(4);
for row = 1 : 4
eval(sprintf('b%d = a(%d, :)', row, row)); %No automatic syntax check, have I made a typo in the string?
end
figure; hold on;
for row = 1 : 4
eval(sprintf('plot(b%d)', row)); %No automatic syntax check, have I made a typo in the string?
end
to:
%using cell arrays
a = magic(4);
b = num2cell(a, 2);
figure; hold on;
cellfun(@plot, b);
Stephen23
Stephen23 on 17 Dec 2015
Edited: Stephen23 on 17 Dec 2015
"damn it's hard not to want to go through the dynamic naming of variables route"
Consider that those numbers at the end of your numbered variable-names are basically indices... so then turn them into real indices that you can actually use. Instead of these dynamically named variables:
x1
x2
x3
etc
with all of their disadvantages: slow and insecure eval required; magic creation of variables into workspaces; totally unpredictable behavior until runtime; impossible to debug; lack of meaningful error messages; easily overwrites existing variables without warning; total loss of editor help tools, code hinting and variable highlighting. So many disadvantages... and yet we can simply turn them into real indices:
x{1}
x{2}
x{3}
etc
With indexing you get fast access using many indexing syntaxes. Easy to track variables. Easy to debug. Warning messages, hints and syntax messages in the Editor. So many tools that help us to code properly. Functions and operators that accept and process those arrays directly.
Many MATLAB functions operate on whole arrays (vectorization) or cell arrays (as Guillaume shows above), so why bother to make your own life harder by _removing the ability to use any of these functions directly.

Sign in to comment.

Accepted Answer

Stephen23
Stephen23 on 15 Dec 2015
Edited: Stephen23 on 19 Jun 2019

More Answers (1)

Adam
Adam on 15 Dec 2015
Edited: Adam on 15 Dec 2015
Do you want r1, r2, r3, r4 to be cell arrays too?
If so I don't see why you would ever want to do this when you could just index into the original.
Alternatively you could rework the original into a single cell array of 4 elements, each containing a [1 4] vector.
e.g.
A2 = cell( 4, 1 );
for n = 1:4
A2{i} = A(i,:);
end
though I'm sure there are neater methods to achieve that.
Don't create 4 numbered variables though, it is a bad idea. (And probably Stephen Cobeldick will be along soon with his usual informative post to save me the trouble of explaining why!)
  1 Comment
Guillaume
Guillaume on 15 Dec 2015
"though I'm sure there are neater methods to achieve that" Indeed:
A2 = num2cell(A, 2); %works even if A is a cell array
I'm not convinced the original array is a cell array though. New posters are easily confused by plain matrices and cell arrays and tend to use the cell wording when referring to elements of plain arrays. It does not matter however, because the answer is the same regardless.
And yes, do not create numbered variables.

Sign in to comment.

Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!