How to put the second "for" loop inside the first one?
조회 수: 2 (최근 30일)
이전 댓글 표시
Hi,
I need to combine two "for" loops.
I actually need the second loop (c and t arrays) to pass through all the results from the first one (a and b). This means a total of 4 results, because the permutations of a and b would be 4.
I have combined them, but it does not work. The output is only 2 results, while they should be 4.
First loop:
close all; clc; clear all;
a = [1 2 3 4 5];
b = [1 2 3 3 5];
for i=1:5;
for j=1:5;
for k = ((i-1)*5)+ j;
line1 = ['set m1 ' num2str(c(i)) ';'];
line2 = ['set m2 ' num2str(s(j)) ';'];
line3 = ['set case ' num2str(t(k)) ';'];
fid=fopen('MatParam8.0.tcl','w');
fprintf(fid,'%s\n',line1);
fprintf(fid,'%s\n',line2);
fprintf(fid,'%s\n',line3);
fid=fclose('all');
!OpenSees Model.tcl
end
end
end
Second loop:
fin = 'result_all.txt';
s = dlmread(fin,'');
c=[1 2 3 4 5];
t=[1 2 3 4 5];
for j = 1:400;
fidP = fopen('Pulse.acc','w+');
fidC= fopen('Case.tcl','w+');
fprintf(fidP, '%d\n%d\n%d',c(j), s(j), t(j));
fprintf(fidC, 'set case %d',j);
fclose(fidP);
fclose(fidC);
!OpenSees Model.tcl
end
The combination:
close all; clc; clear all;
a = [1 2];
b = [1 2];
for i=1:2;
for j=1:2;
for k = ((i-1)*2)+ j;
line1 = ['set m1 ' num2str(a(i)) ';'];
line2 = ['set m2 ' num2str(b(j)) ';'];
line3 = ['set case ' num2str((k)) ';'];
fid=fopen('MatParam8.0.tcl','w');
fprintf(fid,'%s\n',line1);
fprintf(fid,'%s\n',line2);
fprintf(fid,'%s\n',line3);
fid=fclose('all');
fin = 'result_all.txt';
s = dlmread(fin,'');
c=[1 2];
t=[1 2];
for m = 1:4;
fidP = fopen('Pulse.acc','w+');
fidC= fopen('Case.tcl','w+');
fprintf(fidP, '%d\n%d\n%d',c(m), s(m), t(m));
fprintf(fidC, 'set case %d',j);
fclose(fidP);
fclose(fidC);
!OpenSees Model.tcl
end
end
end
end
댓글 수: 16
Bob Thompson
2019년 2월 26일
Nested loops work in such a way that for each of the outer loop runs, the entirety of the inner loop is performed. Suppose we have two loops, with indices x and y.
for x = 1:4;
for y = 1:2;
disp([x,y])
end
end
If you run that code you will notice the output begins with both x and y as 1, but on the next output of the disp x remains as 1 while y becomes 2. The inner loop is now complete, and the exterior loop can now proceed. So x becomes 2, and y resets to 1. The fourth row shows that both x and y are two. This continues until all iterations of the outer loop have been completed.
Alternatively, if you have for loops in a series, the first loop runs fully to completion, and then the second runs fully to completion.
x = 1; y = 1;
for x = 1:4;
disp([x,y])
end
for y = 1:2;
disp([x,y])
end
This produces a series of display outputs where x and y both start at 1 again, but on the second disp x will be 2, and y still 1. On the third x becomes 3, with y unchanged, and so on until the end of the first loop. The second loop then executes, and the first pass displays x as 4 and y as 1 a second time, before the final pass of the loop displays x as 4 and y as 2.
Does that help you understand better the difference between series and nested loops?
I would suggest that you need to use nested loops because you want to run your second loop each time you run your first loop.
Also, I would suggest moving count to before the beginning of the first loop (before for i = ...).
답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!