operator01.jpg

안녕하세요? LGS입니다.
계속 강의만 하려니까 지루하군요.
MATLAB에는 게임도 저장되어 있습니다.

>>sim('sf_tetris2')
042aebb26609e581928901053b4cebed.jpg

ㅋㅋ 지뢰찾기도 있습니다. >>xpbombs 심심할 때 해보세요~ 
참고로 위의 TETRIS는 MATLAB의 Simulink로, 지뢰찾기는 MATLAB GUI로  만든 것입니다. 
Simulink는 차후에 설명하도록 하겠습니다.

그럼 또 강의를 시작해야죠~
895fa41181a97d6764d77a9a9e8c2721.jpg

오늘은 예고한대로 함수의 조건문과 반복문에 대해서 이야기 할까 합니다.
C나 Visual Basic 등을 공부해보신 분들은 MATLAB 프로그래밍도 정말 쉽게 배울 수 있습니다.

1dd08e74bfefa3a06321e7c2081b2ecc.jpg
처음 if... 가장 간단하게 if 만 쓰는 경우는 이런 경우겠죠? (그림의 글자가 잘 보이지 않으시면 그림을 클릭하세요)
if 똥이 마려운가?
    화장실로 달려간다
end

c786669addbd095a956a3bf13984b070.jpg
또 다른 경우~
if 자동차 필기 점수가 70점 이상인가?
     합격!!
else
     불합격!!
end

1edcc26da8a9b32b000a77c4053d15cb.jpg
좀더 복잡하게... 과자를 사먹고 싶은데 만약에 새우깡이 1000원, 조리퐁이 800원 한다고 합시다. 
가지고 있는 돈에 맞추어서 과자를 사는 것을 MATLAB으로 프로그래밍을 한다면 어떻게 될까요?

if 내가가진돈 > 1000원
    새우깡 사먹어야징~
elseif 내가가진돈 > 800원
    조리퐁 사먹어야징~
else
    아놔 나는 거지.. 잠이나 자야겠다
end

조건이 0 이면 False(거짓), 0 이아닌 모든 값 = True(참) 입니다. 
만약 가진 돈이 1500원이라면  '내가가진돈 > 1000원' 이 논리연산은 1을 반환합니다. 
조건이 True이면 실행문이 실행됩니다. 조건이 False이면 다음으로 넘어갑니다.

주의하실 점은 {,}를 사용하지 않는다는 것입니다. 
C와 혼동하시면 안됩니다. MATLAB에서 {,}는  cell을 참조하거나 만들 때 쓰입니다. 
struct, cell은 나중에 설명드리겠습니다. 그리고 마지막은 꼭 end로 닫아 줍니다.

조건문에는 is~로 시작하는 함수가 많이 쓰입니다. 
isempty, isreal, iscell 등등등... 우리나라 말로 ~이냐? 쯤으로 번역될 수 있겠군요. 
메뉴 -> Help -> Product Help -> Search Results 에서 is로 검색해서 is* 항목을 보시기 바랍니다. 
우리가 사용할 수 있는 is~ 함수들이 쭉 있습니다. 
예를 들어 isempty(a)의 경우 a행렬이 빈 행렬이면 참을 빈 행렬이 아니면 거짓을 반환합니다.


ab5d35b743acdaaeb83496fd22a758a0.jpg
이번에는 switch case ...  김밥천국에 가서 점심을 먹는다고 합시다. 
메뉴판을 둘러보고 음식을 시키는 것을 MATLAB으로 코딩한다면??

switch 먹고싶은것
case 김밥
    아줌마~ 여기 김밥이요
case {라면, 밥}
    아주머니~ 여기 라면밥이요
otherwise
    아놔 불신지옥 김밥천국!!
end

{라면,밥}은  '라면'이나 '밥' 둘 중 하나만 먹고 싶어도 라면밥을 시킨다는 말!! 
otehrwise는 일치 되는 것이 없을 때 실행됩니다.
MATLAB의 switch문은 C와는 다르게 break문이 필요없습니다. 알아서 빠져 나온다 이거죠~

이번에는 for 문을 써서 1부터 100까지의 합을 구하는 것을 coding 해봅시다.

k=0;
for n=1:100
    k = k+n;
end

for i=n:100 이 부분을 풀어서 써보죠. Loop가 돌 때마다
[1 2 3 ... ... 100]의 첫번째 element를 n에 대입하고 실행문을 실행 시킵니다. 
그 다음 두번째 element를 n에 대입하고 실행문, 세번째 element를 대입하고 실행문... 
이런식으로 반복 루프를 돌죠. MATLAB에서는 for n = [2 1 4 3] 이런 for 문도 가능 하다는 말입니다.
 break문을 써서 for를 빠져나올 수 있습니다.


7b031a2aa2175fa0d3853c93b814b540.jpg
while 문....

while 배고파?
    밥먹는다
end
배가 안 고플때 까지 계속 밥을 먹습니다. 즉 조건이 참이면 계속 실행문이 실행이 됩니다.

try, catch ... 숙제입니다요 -,.-

위의 이야기들은 사실 영양가가 좀 없는 것들이고 지금부터 하는 이야기가 중요하니 잘 보시기 바랍니다. 
함수를 coding할 때 효율적인(실행시간이 짧은) 함수를 만드시려면 아래의 두가지를 명심하시면 됩니다.
1. 가급적 for문을 피하라. 행렬연산을 적극활용하라!!
2. 크기가 점점 커지는 행렬은 미리 충분한 크기를 잡아줘라!!


위의 두가지를 지킬때와 그렇지 않을 때를 비교해보면 실행시간 차이가 굉장히 많이 납니다. 
물론 똑같은 결과를 돌려주지만 1분만에 돌릴 수 있는 시뮬레이션을 30분동안 돌려야하는 사태도 발생할 수 있습니다. 
좀 심하게 말하면 하루만에 돌릴 수 있는 시뮬레이션을 코딩 잘못해서 한달 내내 돌릴 수도 있다 이겁니다.

예를 들어 난수 10000개를 만들어서 생성된 난수가 만약 0.5보다 크면 1을 0.5보다 작으면 0을 대입하는 
스크립트(또는 함수)를 만든다고 합시다. 
보통의 c나 다른 프로그래밍 언어 스타일로 coding하면 아래와 같이 coding하겠죠...

clear;
tic %스톱왓치 시작, 실행 시간을 잽니다.
a= rand(10000,1);
for i=1:10000
    if a(i)>0.5
        result(i) = 1;
    else
        result(i) = 0;
    end
end
toc %스톱왓치 끝

이렇게 해도 물론 됩니다. 그러나 시간이 많이 걸리지요~~ 
MATLAB의 장점이 뭡니까? 행렬에 최적화 되어있다는 것입니다. 저 같으면 이렇게 짜겠습니다.

tic
result=rand(10000,1)>0.5;
toc

수행 시간을 비교해보세요. 코드도 깔끔허니 보기 좋고... 
지금은 시간이 별 차이가 안나지만 반복문이 많은 큰 프로그램을 짜다보면 굉장히 차이가 많이 남니다.

또 위의 처음 코드에서 result행렬은 크기가 점점 커지고 있습니다. 
for문 앞에 result=zeros(10000,1);  이 한 줄만 삽입해도 실행시간이 확 줄어들어듭니다. 
zeros로 미리 크기를 할당하는데 드는 시간보다 result를 점점 크게만드는 드는시간이 더 크기때문이죠. 
실제로 Editor에서 그러한 행렬에 대해서 행렬 크기가 증가한다고 경고해줍니다. 
행렬의 크기를 모를때에는 적당히 크게 잡으시고 나중에 find 함수등을 활용해서 크기를 줄이시면 되겠습니다.

오늘은 여기 까지입니다.
다음시간에 뵙겠습니다. 꾸벅...
profile