여기에서 정리하는 모든 내용은 고려대학교 문인식 교수님의 '뇌공학프로그래밍입문(INTRODUCTION TO PROGRAMMING FOR BRAIN AND COGNITIVE ENGINEERING)' 강의록을 정리한 내용입니다. 해당 내용에 대한 모든 저작권은 문인식 교수님께 있음을 확인하시길 바랍니다.
지난 시간까지는 프로그래밍에서 가장 중요한 조건문과 반복문 중에서 조건문을 다루는 법을 배웠습니다. MATLAB에서 기존의 언어들과 비슷하게 if/else 문을 통해서 한다는 점을 확인할 수 있었고 조금 특이한 점은 조건문의 마지막에 end로 마무리해야 한다는 점입니다.
이번 시간에는 반복문을 다뤄볼 예정입니다. MATLAB에서는 어떻게 반복문을 하는지 기존 언어와의 차이점은 무엇인지 알아보도록 합시다. 어렵지 않으니 천천히 따라와보세요.
FOR LOOPS
기본적으로 프로그래밍을 해보면 for문 형태와 while문 형태의 반복문이 항상 존재합니다. MATLAB도 동일한 것 같습니다. 일단 for문에 대해서 살펴보면 문법은 다음과 같습니다.
for index = values
statements
end
한번 간단하게 예시를 보시죠. Python에서 for문과 비슷하게 생겼습니다. 아직까지 살짝 어색하긴 하지만 익숙해질 것 같습니다.
이번에는 앞서 배운 입력과 출력을 응용해서 랜덤한 숫자만큼 반복하며 숫자를 입력하고 입력한 숫자들의 합을 구하는 예제를 만들어봅시다. 스크립트를 띄우고 아래의 코드로 실습을 진행해봅시다.
% This script calculates the sum of the n numbers
% entered by the user
n = randi ([3 10]);
runsum = 0;
for i = 1:n
inputnum = input('Enter a number: ');
runsum = runsum + inputnum;
end
fprintf('The n is %.2d\n', n);
fprintf('The sum is %.2f\n', runsum);
이번에는 벡터를 사용한 반복문 예제를 확인해보시죠. 벡터나 행렬에서 인덱싱을 할 때는 소괄호 ( ) 를 이용해야한다는 점 까먹지 않으셨으면 좋겠습니다.
% This script creates a vector of length n
% It prompts the user and puts n numbers into a vector
n = randi ([4 8]);
numvec = zeros(1,n); % Preallocating Vectors
for iv = 1:n
inputnum = input('Enter a number: ');
numvec(iv) = inputnum;
end
fprintf('The vector is: \n')
disp(numvec)
NESTED FOR LOOPS
이번에는 반복문 안에 반복문을 넣어볼까요? 코딩을 처음 시작할 때, 가장 대표적인 예제 중 하나인 별찟기를 해보도록 하겠습니다.
% Prints a box of stars
% How many will be specified by two variables
% for the number of rows and columns
rows = 3;
columns = 5;
% loop over the rows
for i=1:rows
% for every row loop to print *'s and then one \n
for j=1:columns
fprintf('*')
end
fprintf('\n')
end
이번에는 삼각형 모양으로 나오게 하려면 어떻게 할까요? 아래와 같이 for문 안에 for문의 끝을 설정해주면 됩니다.
% Prints a box of stars
% Like triangles
n = 5;
% loop over the rows
for i=1:n
for j=1:i % 이 부분을 주의
fprintf('*')
end
fprintf('\n')
end
마지막으로 피라미드 형태로 나오게 하려면 어떻게 해야할까요? 여러가지 생각할 수 있겠지만, 직관적으로는 for문 안에도 2개의 for문을 이용하면 됩니다. 일단 띄어쓰기를 출력해주는 for문과 별을 출력해주는 for문으로 구성하면 됩니다. 대칭적으로 별 피라미드가 나오게 하기 위해서는 각 행당 홀수개의 별이 출력되도록 설정하였습니다.
% Prints a box of stars
% Like triangles
n = 5;
% loop over the rows
% *
% ***
%*****
for i=1:n
% 띄어쓰기 출력
for k=1:(n-i)
fprintf(' ')
end
% 별 출력
for j=1:2*i-1
fprintf('*')
end
fprintf('\n')
end
WHILE LOOPS
마지막으로 while문입니다. 지금까지 for문의 경우는 조건을 확인해보면 몇번 안에 끝나는지 확인할 수 있었습니다. 하지만 때에 따라서는 끝나는걸 따로 표시하지 않고 계속 반복해야하는 부분도 있습니다. 바로 이런 경우에 while문을 사용하여 효과적인 코딩을 할 수 있습니다. while문의 문법은 다음과 같습니다.
while expression
statemetns
end
for 문과 별반 다를바가 없기 때문에 이후 for문과 while문을 자유롭게 대체해서 쓸 수 있는 연습이 되어 있어야 합니다. 한번 while 문도 예제를 보시죠.
while 문을 이용하여 for문으로 했던 별찟기를 해볼까요?
i=1;
while i<=5
j=1;
while j <= i
fprintf('*')
j=j+1;
end
fprintf('\n')
i=i+1;
end
마지막으로 while문으로 피라미드까지 만들어볼까요?
i=1;
n=5;
while i<=n
j=1;
while j <= n-i
fprintf(' ')
j=j+1;
end
k=1;
while k <= 2*i-1
fprintf('*')
k=k+1;
end
fprintf('\n')
i=i+1;
end
for문보다는 코드가 더러워지긴 했지만, for문과 while문 사이를 왔다갔다 하면서 자유자재로 대체할 수 있어야합니다. 어떤 경우에는 for문을 써야하겠지만, 또 다른 경우에는 while문을 사용해야할 필요도 있을 겁니다. 하지만 for문과 while문 중에 우위가 있는 문법은 없지요. 하지만 저의 경우는 while보다는 for문을 선호하는 편입니다.
LOOPS WITH VECTORS AND MATRICES; VECTORIZING
마지막으로 MATLAB에서 벡터나 행렬에 대해서 반복문이 어떻게 작동하는지 알아보도록 하죠. 예를 들어서
1 2 3
4 5 6
와 같은 행렬이 있다고 생각해봅시다. 이런 경우에 대해서 반복문은 어떻게 돌까요?
출력을 보고 바로 이해하신 분은 MATLAB에서 벡터나 행렬에 대해서 반복문이 어떻게 작동하는지 조금 이해하신 분입니다. 저도 여전히 헷갈리지만, 행렬의 경우에는 항상 column 으로 먼저 따져야합니다. 무슨 말이냐면 우리의 직관대로 행 먼저 도는게 아니라, 열 먼저 돌기 때문에 1 다음에 2가 아닌 4가 나오게 되고, 그리고 2가 나오게 되는 겁니다.
참고자료
'프로그래밍 언어(Programming Language) > 매트랩(MATLAB)' 카테고리의 다른 글
[MATLAB] 6강 - 사용자 정의 함수 (0) | 2020.10.28 |
---|---|
[MATLAB] 4강 - 조건문 (0) | 2020.10.23 |
[MATLAB] 3강 - 입력과 출력 (0) | 2020.10.23 |
[MATLAB] 2강 - 벡터와 행렬 (0) | 2020.10.19 |
[MATLAB] 1강 - 설치 및 기초 문법 (0) | 2020.10.17 |