변수 이름을 정하는 것은 코딩을 하는 모든 사람들의 영원한 숙제이다. 매틀랩에서 특이한 점으로는 초보자를 제외하고는 i와 j를 잘 사용하지 않는다는 것이다. i와 j는 c언어와 같은 범용 프로그래밍 언어에서 가장 자주 쓰이는 for 루프 인덱스 변수이다. 예를 들면

int sum = 0;
for (i=1; i<=100; i++) {
    sum = sum + i;
    }

아무 문제 없이 잘 쓰여진 c언어 기초 예제이다. 위 코드를 매틀랩으로 거의 비슷하게 적어도 돌아는 간다.

sum = 0;
for i=(1:100)
  sum = sum + i;
end

하지만 매틀랩에서 이러면 곤란한 점이 있다. 한 가지 문제는 매틀랩에서 for 루프를 거의 쓰지 않는다는 것이고, 두 번째 문제는 변수로 i를 잘 쓰지 않는다는 것이다. 보통 c언어 비슷한 다른 언어를 주로 쓰다가 매틀랩을 처음 쓰는 사람들은 그렇게들 많이 한다. 그리고 매틀랩을 깊게 자주 사용할 필요가 없는 사람들은 그게 효율적이고 안전한 길일 수도 있다. 매틀랩으로 작업하는 양이 많아질 때 이런 습관을 지속한다면 수백 배, 수천 배 느린 프로그램이 될 것이고 코드의 유지보수가 안 그래도 별로 가독성 좋지 않은 매틀랩에 더욱 큰 난관을 만드는 것이다.

매틀랩에서는 이렇게 하는 것이 좋다.

summation = sum(1:100);

이렇게 한 줄로 끝나는 것이 가장 적절한 코드이다. 이것을 벡터화 vectorization이라고 한다. 한 가지 더 눈여겨 볼 점은 변수 이름으로 i를 사용하지 않았다는 점, 변수 이름으로 sum 을 사용하지 않았다는 점이다.

i를 사용하지 않은 이유를 설명하기 위해 아래 예제를 보자.

val2 = val + i;
val2 = val + ii; 
val2 = val + 1i; 

첫 번째 줄은 원래 변수에 허수 i를 더한다. 만약 워크스페이스에 i라는 변수가 있다면 그 변수를 val에 더한다. 두 번째는 원래 변수에 ii라는 변수를 더한다. ii가 워크스페이스에 없다면 오류가 난다. 세 번째는 val에 허수 1i를 더한다. 두 번째와 세 번째는 괜찮은 예이다. 첫 번째는 워크스페이스에 변수 i가 있는지 없는지에 따라서 해석이 달라지는 불완전한 코드이다. 첫 번째 줄과 같은 표현이 등장하면 매틀랩은 상황을 파악하기 위해 실행 시간이 더 오래 걸리게 되고, 가독성이 나빠지며 코드를 복사에서 다른 곳에 사용할 때 문제가 생길 수 있다.

수학과 달리 전자공학에서는 전류를 나타내는 i와 구분하기 위해 옛날부터 허수로 j를 많이 썼기 때문에 매틀랩에서는 i와 j 모두 허수를 만드는 도구로 쓰인다. 말하자면 내장 함수 이름같은 그런 존재이다. 변수로 i와 j를 쓰는 것은 내장 함수 이름을 변수로 지정하는 것과 비슷하게 된다. 돌아는 간다. 하지만 뭔가 찜찜한 기분이 계속 드는 것이다. 비슷하게 자주 초보자의 코드에서 흔히 발견할 수 있는 모호한 변수 이름으로 sum, max, size, length 등이 있다. a, a1, a11, a2, aaa 등을 글로벌하게 쓰는 극단적인 스파게티는 논외로 치더라도.

매틀랩 난독 코드를 한 번 살펴보자. 절대 이렇게 하라는 것은 아니지만 정수 변수 j가 있다면 이 코드도 돌아는 간다. 이걸 보고 웃을 수 있다면 당신은 매틀랩 초보는 아닐 것이다.

for i=1:3+j
a = 1+i;
end
sum = sum(a);

나는 이런 헬게이트를 방지하기 위해서 idx, idy, idz 세 가지를 변수 이름으로 많이 사용한다. 가끔 특별히 구분해야 하는 경우는 길이가 길어지는 것을 감수하고 id_temperature 같은 정수 인덱스를 사용하는 경우도 있다. 간혹 i, j, k 대신 ii, jj, kk를 사용하는 때가 있다. 나는 i j k 를 사용한 남의 코드에서 갑자기 허수가 등장하는 문제를 고칠 때 이 방법을 종종 썼다. 유한 해석에서 간혹 마지막 인덱스를 ii 등 두 글자를 사용하는 때가 있기 때문에 가독성이 떨어질 염려가 있는 것은 사실이다. 보통은 id*로 시작하는 변수 이름으로 idi, idj, idk쓰며 마지막은 idi_f 등으로 하는 것이 더 편하다.


2019/08/05 07:07 2019/08/05 07:07
얼음꽃 이 작성.

 

 

 

 

Trackback URL : 이 글에는 트랙백을 보낼 수 없습니다

Trackback RSS : http://ppaktion.maru.net/rss/trackback/1002

Trackback ATOM : http://ppaktion.maru.net/atom/trackback/1002


당신의 의견을 작성해 주세요.

  1. Comment RSS : http://ppaktion.maru.net/rss/comment/1002
  2. Comment ATOM : http://ppaktion.maru.net/atom/comment/1002
  3. 비밀방문자 2019/11/27 22:36  편집/삭제  댓글 작성  댓글 주소

    관리자만 볼 수 있는 댓글입니다.

: 1 : ... 40 : 41 : 42 : 43 : 44 : 45 : 46 : 47 : 48 : ... 876 :