수색…


비고

열 벡터 반복

일반적인 버그 소스는 열 벡터의 요소를 반복하려고합니다. 열 벡터는 하나의 열이있는 행렬처럼 취급됩니다. (실제로 Matlab에는 아무런 차이가 없습니다.) for 루프는 루프 변수를 열로 한 번 실행합니다.

% Prints once: [3, 1]
my_vector = [1; 2; 3];
for i = my_vector
    display(size(i))
end

반복 변수 변경하기

반복 변수를 변경하면 현재 반복의 값이 변경되지만 후속 반복의 값에는 영향을주지 않습니다.

% Prints 1, 2, 3, 4, 5
for i = 1:5
    display(i)
    i = 5; % Fail at trying to terminate the loop
end

오른쪽의 a:b 특수 케이스 성능

기본 예제에서는 1:n 을 행 벡터를 만든 다음 반복 실행하는 일반적인 인스턴스로 취급합니다. 성능상의 이유로 Matlab은 실제로 a:b 또는 a:c:b 행 벡터를 완전히 생성하지 않고 한 번에 하나씩 각 요소를 작성함으로써 처리합니다.

이는 구문을 약간 변경하여 감지 할 수 있습니다.

% Loops forever
for i = 1:1e50
end
% Crashes immediately
for i = [1:1e50]
end

루프 1 ~ n

가장 간단한 경우는 알려진 수의 고정 된 시간 동안 작업을 수행하는 것입니다. 1에서 n 사이의 숫자를 표시하려면 다음과 같이 작성할 수 있습니다.

n = 5;
for k = 1:n
    display(k)
end

루프는 내부 ​​문장 (들), forend 사이의 모든 것을 n 번 (이 예제에서는 5) 실행합니다 :

1
2
3
4
5

다음은 또 다른 예입니다.

n = 5;
for k = 1:n
    disp(n-k+1:-1:1) % DISP uses more "clean" way to print on the screen
end

이번에는 루프에서 nk 를 모두 사용하여 "중첩 된"디스플레이를 만듭니다.

 5     4     3     2     1

 4     3     2     1

 3     2     1

 2     1

 1

벡터의 요소를 반복 처리합니다.

for 루프에서 할당의 오른쪽은 모든 행 벡터가 될 수 있습니다. 할당의 왼쪽에는 유효한 변수 이름을 사용할 수 있습니다. for 루프는이 벡터의 다른 요소를 각 실행 변수에 할당합니다.

other_row_vector = [4, 3, 5, 1, 2];
for any_name = other_row_vector
    display(any_name)
end

출력이 표시됩니다.

4
3
5
1
2

( 1:n 버전은 Matlab 1:n[1, 2, ..., n] 의 행 벡터를 구성하기위한 구문 일 뿐이므로 이것의 일반적인 경우입니다.)

따라서 다음 두 코드 블록은 동일합니다.

A = [1 2 3 4 5];
for x = A
  disp(x);
end

for x = 1:5
  disp(x);
end

다음은 동일합니다.

A = [1 3 5 7 9];
for x = A
  disp(x);
end

for x = 1:2:9
  disp(x);
end

모든 행 벡터가 수행합니다. 그들은 숫자 일 필요는 없습니다.

my_characters = 'abcde';
for my_char = my_characters
    disp(my_char)
end

출력 할 것이다.

a
b
c
d
e

행렬에 대해 반복 수행

할당의 오른쪽이 행렬이면 각 반복에서 변수에이 행렬의 후속 열이 할당됩니다.

some_matrix = [1, 2, 3; 4, 5, 6]; % 2 by 3 matrix
for some_column = some_matrix
    display(some_column)
end

(행 벡터 버전은 Matlab에서 행 벡터가 열이 크기 1 인 행렬이기 때문에 보통의 경우입니다.)

출력이 표시됩니다.

1
4
2
5
3
6

즉 반복 된 행렬의 각 열이 표시되며 각 열은 각 display 호출에 인쇄 display .

루프 오버 인덱스

my_vector = [0, 2, 1, 3, 9];
for i = 1:numel(my_vector)
    my_vector(i) = my_vector(i) + 1;
end

for 루프로 수행되는 가장 간단한 작업은 벡터화 된 연산을 통해 빠르고 쉽게 수행 할 수 있습니다. 예를 들어 위 루프는 my_vector = my_vector + 1my_vector = my_vector + 1 수 있습니다.

중첩 루프

루프는 중첩되어 다른 반복 된 작업 내에서 반복 된 작업을 수행 할 수 있습니다. 다음 루프를 고려하십시오.

ch = 'abc';
m = 3;
for c = ch
    for k = 1:m
        disp([c num2str(k)]) % NUM2STR converts the number stored in k to a charachter,
                             % so it can be concataneted with the letter in c
    end
end

우리는 2 개의 반복자를 사용하여 abc1:m 의 요소의 모든 조합을 표시합니다.

a1
a2
a3
b1
b2
b3
c1
c2
c3

또한 중첩 된 루프를 사용하여 매번 수행 할 작업과 여러 번의 반복 작업을 한 번에 결합 할 수 있습니다.

N = 10;
n = 3;
a1 = 0; % the first element in Fibonacci series
a2 = 1; % the secound element in Fibonacci series
for j = 1:N
    for k = 1:n
        an = a1 + a2; % compute the next element in Fibonacci series
        a1 = a2;      % save the previous element for the next iteration
        a2 = an;      % save ht new element for the next iteration
    end
    disp(an) % display every n'th element
end

여기 모든 피보나치 시리즈 를 계산하지만, 매번 n 번째 요소 만 표시하기를 원합니다.

   3
   13
   55
   233
   987
   4181
   17711
   75025
   317811
   1346269

우리가 할 수있는 또 다른 일은 내부 루프 내에서 첫 번째 (바깥 쪽) 반복자를 사용하는 것입니다. 다음은 또 다른 예입니다.

N = 12;
gap = [1 2 3 4 6];
for j = gap
    for k = 1:j:N
        fprintf('%d ',k) % FPRINTF prints the number k proceeding to the next the line
    end
    fprintf('\n')        % go to the next line
end

이번에는 중첩 루프를 사용하여 출력 형식을 지정하고 요소 사이에 새로운 간격 ( j )이 도입 된 경우에만 줄을 제동합니다. 바깥 쪽 루프의 틈새 너비를 통해 반복하고 내부 루프 내에서 사용하여 벡터를 반복합니다.

1 2 3 4 5 6 7 8 9 10 11 12 
1 3 5 7 9 11 
1 4 7 10 
1 5 9 
1 7 

주의 사항 : 이상한 동일한 카운터 중첩 루프.

이것은 다른 프로그래밍 환경에서 볼 수있는 것이 아닙니다. 저는 몇 년 전에 그것을 보았습니다. 왜 그런 일이 일어 났는지 이해할 수 없었지만, 얼마 동안 MATLAB을 사용하여 작업을 끝내고 나면 알아낼 수있었습니다. 아래의 코드 스 니펫을 살펴보십시오.

for x = 1:10
    for x = 1:10
        fprintf('%d,', x);
    end
    fprintf('\n');
end

이것이 제대로 작동한다고 기대하지는 않지만 다음과 같은 결과가 나옵니다.

1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,
1,2,3,4,5,6,7,8,9,10,

그 이유는 MATLAB의 다른 모든 것들과 마찬가지로 x 카운터 또한 정확한 행렬 인 벡터입니다. 따라서 x 는 모든 결과 루프 (중첩 또는 포함되지 않음)에 적절히 참조되는 '배열'(일관된 연속 메모리 구조)에 대한 참조 일뿐입니다. 중첩 루프가 동일한 식별자를 사용한다는 사실은 해당 배열의 값이 참조되는 방법과 아무런 차이가 없습니다. 유일한 문제는 중첩 루프 내에서 외부 x 가 중첩 된 (로컬) x 의해 숨겨 지므로 참조 할 수 없다는 것입니다. 그러나 중첩 루프 구조의 기능은 그대로 유지됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow