How can I append arrays onto the same variable in a series of loops?

46 views (last 30 days)
Hi, I am a beginner in MATLAB and was wondering if someone with more experience would find it easyto do what I am trying to achieve. I have a number of 2x6 matrices that I would like to "append" to one another in the z-dimension in order to make a single 3D variable. I would then like to output this variable as a .mat file. For example, lets say I have 3 different options, and each one has 3 sub-options which yield me a total of 9 different matrices. I had envisioned something like the following, but I can't get it to work. The goal would be to have a single variable that is 2x6x9 Any help is greatly appreciated. Thanks!
My bad example:
x = zeros(2,6);
counter=0;
for i=1:3
counter = counter+1;
for j=1:3
x(:,:,counter)= rand(2,6);
save('test.mat','x','-append');
counter = counter+1;
end
end
JH

Answers (2)

Stephen23
Stephen23 on 5 May 2015
Edited: Stephen23 on 5 May 2015
Solution One: Vectorized
Your example uses rand, which lets you generate the whole 3D array directly by specifying the outputs size in a vector, no loops or concatenation is required:
out = rand([2,5,3]);
This will be much faster than using any loop and concatenating arrays, and is a good introduction to vectorized code! However if you really want to concatenate arrays, then read on...
Solution Two: with for-Loop
For a start there is no reason why you need to use the variable counter when you already have the for-loop variable. Why bother? And preallocating the array will make this faster. But the basic issue is that you are trying to concatenate and save the matrix in each loop iteration. Why not just create the whole array, and then save it?:
>> N = 3;
>> X = nan([2,6,N]);
>> for k = 1:N
X(:,:,k) = rand(2,6);
end
>> save('test.mat','X')
Bonus Information on Concatenation
One of the easiest way of concatenating matrices is to use cat:
>> A = [1,2;3,4];
>> B = [10,20;30,40];
>> C = [0,NaN;Inf,-Inf];
>> out = cat(3,A,B,C)
out(:,:,1) =
1 2
3 4
out(:,:,2) =
10 20
30 40
out(:,:,3) =
0 NaN
Inf -Inf
Note that this is even easier if you place the variables into a cell array:
>> Z = {A,B,C};
>> out = cat(3,Z{:})
  3 Comments
Stephen23
Stephen23 on 5 May 2015
Sure, attach some graphic / daigram, as this is not clear to me. Did Solution Two not work?
Jono Horne
Jono Horne on 5 May 2015
I have attached a drawing of the current workflow. I have the script set up so that a user can choose the path via input prompts. They select a Modifier 1, and Modifier 2, and that gives them a unique 2x6 matrix. I instead would like to make Matlab run through each iteration and save the results into one 2x6x9 matrix. Any info is greatly appreciated. LEt mek now if you have any further questions

Sign in to comment.


Delladj Kamel
Delladj Kamel on 5 May 2015
*It's easy, just type this code and you'll get what you are expecting*
x = zeros(2,6);
for i=1:9
x(:,:,i)= rand(2,6);
end
save('test.mat','x');
results
x(:,:,1) =
0.3724 0.4897 0.9516 0.0527 0.2691 0.5479
0.1981 0.3395 0.9203 0.7379 0.4228 0.9427
x(:,:,2) =
0.4177 0.3015 0.6663 0.6981 0.1781 0.9991
0.9831 0.7011 0.5391 0.6665 0.1280 0.1711
x(:,:,3) =
0.0326 0.8819 0.1904 0.4607 0.1564 0.6448
0.5612 0.6692 0.3689 0.9816 0.8555 0.3763
x(:,:,4) =
0.1909 0.4820 0.5895 0.3846 0.2518 0.6171
0.4283 0.1206 0.2262 0.5830 0.2904 0.2653
x(:,:,5) =
0.8244 0.7302 0.5841 0.9063 0.8178 0.5944
0.9827 0.3439 0.1078 0.8797 0.2607 0.0225
x(:,:,6) =
0.4253 0.1615 0.4229 0.5985 0.6959 0.6385
0.3127 0.1788 0.0942 0.4709 0.6999 0.0336
x(:,:,7) =
0.0688 0.5309 0.4076 0.7184 0.5313 0.1056
0.3196 0.6544 0.8200 0.9686 0.3251 0.6110
x(:,:,8) =
0.7788 0.0908 0.1537 0.4401 0.4574 0.5181
0.4235 0.2665 0.2810 0.5271 0.8754 0.9436
x(:,:,9) =
0.6377 0.2407 0.2891 0.6951 0.2548 0.6678
0.9577 0.6761 0.6718 0.0680 0.2240 0.8444
  2 Comments
Stephen23
Stephen23 on 6 May 2015
This would be significantly improved by using array preallocation, simply by defining the final size of the matrix at the beginning:
x = zeros([2,6,9]);

Sign in to comment.

Categories

Find more on Creating and Concatenating 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!