Storing values from nested FOR loop (array only saves last run of results)

68 ビュー (過去 30 日間)
adam
adam 2014 年 3 月 6 日
コメント済み: Dyuman Joshi 2024 年 2 月 28 日
Hi guys, have tried searching but can't find anything to help, maybe my problem is too simple! lol Anyway, I'm running a nested FOR loop, but the array I save my results to only keeps the last "run" of results. Can someone please help me to store/concatenate the results in a single array? EG the resultant array should have 12 rows, not 4. with column one going 1,2,3,4,1,2,3,4,1,2,3,4 and column two going 10,10,10,10,20,20,20,20,30,30,30,30.
Cheers in advance! (first line currently commented out as the last 8 rows stay zero at the minute)
%tableA = zeros(12,2);
for i=1:4
for j=1:3
answerA=i*1
answerB=j*10
tableA(i,:)=[answerA answerB]
end
end
P.S. this isn't the real code I'm using, but a dumbed down version just so I can get the correct syntax to use to apply to the bigger problem! Cheers.
  2 件のコメント
Kyle
Kyle 2015 年 7 月 15 日
tableA = zeros(12,2); for j = 1:4
for m = 1:4
for i = 1:4
answerA = i;
answerB = 10;
tableA(i,:) = [answerA answerB];
end
answerA = m;
answerB = 20;
tableA(m+4,:) = [answerA answerB];
end
answerA = j;
answerB = 30;
tableA(j+8,:) = [answerA answerB];
end
There is probably an easier way, but this works.
Aroosh Amjad
Aroosh Amjad 2017 年 2 月 13 日
any body can give me exact code for storing values in "ForLoop".? i would be very thankful to you

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

採用された回答

Thomas
Thomas 2014 年 3 月 6 日
編集済み: MathWorks Support Team 2018 年 11 月 28 日
for i=1:4
for j=1:3
answerA(i,j)=i*1;
answerB(i,j)=j*10;
% tableA(i,:)=[answerA answerB]
end
end
table=[reshape(answerA,[],1) reshape(answerB,[],1)]
  2 件のコメント
adam
adam 2014 年 3 月 6 日
thanks mate, works a treat!
Adithya Prabhu
Adithya Prabhu 2017 年 12 月 22 日
can you please explain how this works?

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

その他の回答 (4 件)

dpb
dpb 2014 年 3 月 6 日
As this is clearly early learning, let's go with a hint-based approach rather than just throwing out an answer -- might make it more beneficial to discover the answer sorta' on your own...
%tableA = zeros(12,2);
for i=1:4
for j=1:3
answerA=i*1
answerB=j*10
tableA(i,:)=[answerA answerB]
...
1) preallocating is a_good_thing (tm) so bring that back out of retirement but -- first, for ease use a variable for the upper limit on the two loops so you can modify them and easily compute the size of the array needed--
nr=4; % rows
nc=3; % columns
table=zeros(nr,nc); % preallocate
2) NB: that answerA is invariant with j so move it outside the inner loop--no sense doing stuff over and over that is the same answer every time--
for i=1:nr
answerA=i*1; % of course the '*1' isn't needed but it's tutorial, so ok...
3) Now to the nub of your ? --
for j=1:nc
AnswerB=j*10; % NB: this doesn't give what you say you want, either...
table(?,?) = ???
Walk thru the steps and follow what i is each pass -- it should be apparent what the next row index should be; what computation would generate that?
After that, then look at how to get the indices for the two values in the proper columns -- it's a similar idea. Or, of course, instead of building a vector to store two at a time, store the individual i,j elements in their correct location when generate them is more direct.
4) Rethink the whole process and see if you cannot actually compute the whole thing in a vectorized form and eschew the loops entirely. That's "the Matlab way".
Chew on that a while and then come back... :)
  2 件のコメント
adam
adam 2014 年 3 月 6 日
thanks for the reply, unfortunately I'm not too sure what you're on about lol. The vectorising sounds interesting though - I'll try and do some googling on that if I have time. Cheers
Dyuman Joshi
Dyuman Joshi 2024 年 2 月 28 日
@Manuel Campos notes on @dpb's answer - "Thorough explanation and the solution."

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


PANKAJ PANDYA
PANKAJ PANDYA 2016 年 10 月 3 日
編集済み: PANKAJ PANDYA 2016 年 10 月 3 日
if true
% i think you would like it
% i liked the question. it really checked my aptitude
table=zeros(12,2);
for k=0:4:8
for i=1:4
for j=1:2
if mod(j,2)==0
table(i+k,j)=i;
else
table(i+k,j)=10*(k/4+1);
end
end
end
end
end
it works fine

Sawan Kumar Jindal
Sawan Kumar Jindal 2016 年 10 月 3 日
編集済み: Sawan Kumar Jindal 2016 年 10 月 3 日
The first thing to do is assign zero value to each location of the matrix and then, use for loops to store the value. You have not initialised the memory for all the locations.
Code ex:
for i=1:4
for j=1:3
answerA(i,j)=i*1;
answerB(i,j)=j*10;
tableA(i,:)=[answerA answerB]
end
end

adam
adam 2014 年 3 月 6 日
Hi guys,
the first answer worked great, however I can't use a step size less than 1 (as indices can't be less than 1 right?)
Do I need a different method in order to achieve what the below code is trying to do?
(I just get "??? Attempted to access answerA(1.5,1); index must be a positive integer or logical." error)
for i=1:0.5:4
for j=1:3
answerA(i,j)=i*1;
answerB(i,j)=j*10;
end
end
table=[reshape(answerA,[],1) reshape(answerB,[],1)]
Moving my answerA outside the j loop didn't work either, but that's a minor thing.
Cheers
  2 件のコメント
adam
adam 2014 年 3 月 6 日
sorry guys, think I've sorted it. Just added an index value as below:
index=0;
for i=1:0.5:4
for j=1:3
index=index+1;
answerA(index)=i*1;
answerB(index)=j*10;
end
end
table=[reshape(answerA,[],1) reshape(answerB,[],1)]
Any thoughts or comments are still greatly appreciated though! Cheers Adam
dpb
dpb 2014 年 3 月 6 日
BINGO!!! on that lesson... :)
Note however you still have answerA computed 24 times when it's only needed to be done 8 by not moving the j-invariant portion of the code outside the loop on j

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

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by