How to make a series of consecutive numbers using a nested for loop?

조회 수: 3 (최근 30일)
Giovanni Rinaldi
Giovanni Rinaldi 2016년 2월 10일
답변: Jan 2016년 2월 14일
Hi, I would like a generic expression to obtain an array of consecutive numbers until reaching the value of the product between the limits of two nested loops. I hope the example below will clarify the question. If I have the nested loop:
for i = 1:3
for j = 1:5
a = ????;
disp(a)
end
end
Which is the expression for 'a' that permits me to obtain a column array from 1 to 15?
a=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Maybe there are easier way to obtain this but I must use a nested loop and the last number must be equal to the product of the two limits of the for loop (3 and 5 => 15 in this example). Many thanks.
  댓글 수: 4
Guillaume
Guillaume 2016년 2월 10일
I still don't understand what you want. What part of a do you want to calculate in the loop? Would the following work?
limit_loop1 = 3;
limit_loop2 = 5;
for i = 1:limit_loop1
for j = 1:limit_loop2
a = 1:limit_loop1*limit_loop2; %but what's the point?
end
end
Giovanni Rinaldi
Giovanni Rinaldi 2016년 2월 10일
Hi, the solution you propose gives as result:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2
1 2 3 4
1 2 3 4 5 6
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9 10
1 2 3
1 2 3 4 5 6
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Which is different from what I am looking for.

댓글을 달려면 로그인하십시오.

채택된 답변

Jan
Jan 2016년 2월 14일
It's not clear to me, what you want to achieve. So let me guess a little bit:
1. The direct approach:
L1 = 3;
L2 = 5;
a = (1:(L1*L2)).'
2. With the loops:
a = [];
c = 0;
for i = 1:3
for j = 1:5
c = c + 1;
a = [a; c]; % Prefer a pre-allocation
disp(a)
end
end
3. Using the paramters mentioned in my first answer:
a = [];
for i = 1:3
for j = 1:5
a = [a; (i - 1) * 5 + j];
disp(a)
end
end
But nothing will beat the approach 1. in speed and clarity.

추가 답변 (2개)

Jan
Jan 2016년 2월 10일
This looks like a homework question. Do you really want us to solve it, or would delivering the solution made by someone else be cheating?
What about defining a=0 at the beginning and increasing a by one inside the loops?
You can find some constants b, c and d manually, such that
b * i + c * j + d = 1 % for i=1 and b=1
b * i + c * j + d = 2 % for i=1 and b=2
etc
  댓글 수: 1
Giovanni Rinaldi
Giovanni Rinaldi 2016년 2월 10일
Hi Jan, thanks for your help. This is not at all a homework but a part of a code I am trying to develop in a much wider context. I am sorry but I do not understand how introducing some constants can help. I would like to keep the problem as simple as possible, without introducing new parameters, also because deciding their value could be tricky as well. However, defining a=0 at the beginning is a useful hint. I will further work on this aspect.

댓글을 달려면 로그인하십시오.


Guillaume
Guillaume 2016년 2월 10일
Maybe one of these is what you want. It's really not clear what you want to do within the loops:
Possible solution #1:
limit_loop1 = 3;
limit_loop2 = 5;
a = zeros(limit_loop1 * limit_loop2, 1);
for i = 1:limit_loop1
for j = 1:limit_loop2
aidx = sub2ind([limit_loop1, limit_loop2], i, j);
a(aidx) = aidx;
end
end
Possible solution #2:
limit_loop1 = 3;
limit_loop2 = 5;
a = 1;
for i = 1:limit_loop1
for j = 1:limit_loop2
if i>1 || j>1
a = [a(end); a+1];
end
end
Neither of which make much sense to me, since as pointed out:
a = 1:limit_loop1*limit_loop2
gives the same result without needing the loops

카테고리

Help CenterFile 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