MATLAB
disp( 'Hello, world!' )
'Hello World!'
[clearfix]
1. 개요
보스턴에 본사를 두고 있는 Mathworks 社에서 개발한 공학용 어플리케이션 소프트웨어 패키지.
일부 사람들이 프로그래밍 언어로 이해하기도 하지만, 프로그래밍 언어라기 보다는 해당 소프트웨어의 스크립팅 인터페이스를 사람들이 언어로 받아들이는 것에 가깝다. 이 사실은 MATLAB의 수익구조가 컴파일러 자체의 판매가 아니라, 각종 툴박스/어플리케이션들의 판매에 기반하고 있는 것을 보면 알 수 있다.[1] R2014b까지는 1기가 램을 지원하며 그 이후는 최소 2기가 램이 필요하다. 이름의 MAT는 수학(mathematics)이 아니라 행렬(matrix)에서 따왔다. MATLAB 로고는 L자 모양의 Membrane을 진동시킬 때 나타나는 Eigenmode 중 하나를 시각화하면 만들 수 있으며, 공식 홈페이지에 만드는 방법이 나와있다.
대부분의 미국 공대에서 처음으로 프로그래밍에 입문하는 학생들이 제일 먼저 배우는 프로그램이다. 프로그래밍 언어라고 볼 수도 있고, 애플리케이션으로도 볼 수 있으나[2] , 쓰는 사람의 목적에 따라 두 가지 성격이 모두 나타나기도 한다. 하지만 이런 성격 때문에 장단점이 꽤나 극단적으로 나타나는, 빛과 어둠이 공존하는 프로그래밍 언어 겸 애플리케이션이라고 볼 수 있다. 하고자 하는 일에 따라서 편리할 때는 한없이 편리하지만[3] , 불편할 때는 한없이 불편하다.[4]
국내에서도 이공계열 대학생/영재학교, 과학고 학생들이 제법 많이 사용하고 있다. 문법은 아주 간단하다. 프로그래밍에 전문적이지 못한 학생들이 논문을 위한 시뮬레이션을 하기 위해 접하는 경우 등, 급작스럽게 필요하여 사용하는 경우가 많아서 정통한 사람이 많지 않다.[5] 그 때문인지 전공 지식이 부족해도 이 프로그램을 잘 다룬다면, 아니, '''포기하지 않고 끈기 있게 붙잡고 늘어질 수만 있어도 대학원 선배들이나 교수들로부터 굉장히 이쁨받는다.'''
어찌보면 공대 학부/대학원 졸업 후엔 쓰기 힘든 프로그램이다. 라이센스가 비싸서 어지간한 회사에서 못 사주기 때문이다. 어지간한 연구소/회사에서는 MATLAB 라이센스를 사주는 대신에 기존에 보유하고 있는 C/C++/FORTRAN 등의 코드에 맞게 연구자가 코드를 개발하길 바란다. 가끔씩, 부유한 환경에서는 업체/기관에서 MATLAB을 제공하기는 한다.[6] 다만 이 때에도 최종 목표가 MATLAB 프로그램이라기 보다는, 프로토타이핑을 MATLAB으로 해서 성능을 검증하고 C++ 등으로 변환을 하거나, 시뮬링크 기반의 자동코드 생성기법을 활용하여 시뮬링크 블럭 다이어그램으로부터 embedded C 코드를 생산해 내기도 한다. 그리고 요즘은 MATLAB 못지 않게 간단한 문법을 가진 Python의 인기가 하늘 높은 줄 모르고 치솟는 중인데다가 공짜, 오픈소스라서 MATLAB 라이선스 비용을 못 내는 회사에서 대체용으로 많이 쓰인다. 파이썬이 공학을 노리고 만들어진 언어는 아니지만 matplotlib, numpy 등 유용한 라이브러리가 많기 때문에 잘 다룰 줄만 안다면 거의 왠만하면 MATLAB의 대용품으로 딱히 부족할게 없다. 때문에 공대에서 매트랩 과목을 파이썬으로 개편해버리는 경우도 종종 있다.
참고로 '''MATLAB 툴박스는 대개 석사 수준의 알고리즘까지는[7] 상당 부분 지원'''하고 있지만 Fortran, C 등에서는 Singular Value Decomposition(SVD) 같은 기초적인 수치해석 알고리즘만 수행하려고 해도 이런 저런 라이브러리들을 죄다 받거나 책을 보면서 '''직접 코딩'''해야 하기 때문에 굉장히 피곤해진다. 물론 박사급이면 없는 것을 만드는게 당연하기 때문에 크게 문제가 되지 않는 분야도 넘쳐 난다. 다시 말하면 라이브러리 몇 개를 새로 짜는 셈.
2. 용도
공학용으로 개발된 만큼 공학계열 학과에서 주로 사용한다.
MATLAB 자체적으로 여러 하드웨어(예를 들어 모터류)의 인터페이스, 이미지 프로세싱 등의 유용한 툴박스들을 제공하고 있어 학부 수준까지는 손쉽게 사용할 수 있다. 이런 점이 프로그래밍 언어 자체로 봤을 때는 다소 어정쩡한(그리고 문법도 안 좋은) MATLAB이 공학 관련 분야에서 널리 활용되고, 또 비싸게 팔아도 장사가 되는 비법이다.
예를 들어, 모터가 4개 달린 드론에 카메라를 달아서 시각 비행알고리즘을 시험하고 싶자고 하자. 여기에는 모터제어, 드론과의 통신, 이미지 프로세싱, 위치/자세 추정, 위치/자세 제어 알고리즘 등이 필요하다. 다른 개발 환경에서는 각각의 기능을 제공하는 환경은 있어도, 관련된 모든 라이브러리를 제공하는 경우는 MATLAB 말고는 드물다.[8] 하드웨어의 종류/구성에 따라, 인터페이스 구축의 난이도가 코드를 쓰는 난이도를 훨씬 상회할 수 있다.
다만 MATLAB이 유용하다고 만능은 아닌지라 상황에 따라 다른 언어와 병용해서 쓰기도 한다. 보통 공학용 수치해석을 위해서는 MATLAB, Python, Julia 등의 스크립팅 언어로 골격을 짠 다음에, 병목현상이 일어나는 부분만 C/FORTRAN 등으로 변환하여 포팅을 하는 것이 일반적이다. 예를 들어 GUI를 포함하는 hardware-in-loop 시뮬레이터를 만든다고 생각해보자. 하드웨어 제어를 위한 embedded C, GUI, 제어, 추정 알고리즘이 필요하다. 그 외에도 matrix exponential, convolution, 수치적분, root-finding, 수치 최적화, curve-fitting 등 수치해석이 필요하다.
2.1. 이공계
일부 공대에서는 쉬운 문법에 주목해서 프로그램의 개념을 익히기 위한 입문용으로 쓰인다.
전자공학과에서는 전공과목 과제에 주로 MATLAB이 사용된다. 일부 흔한 과제의 예를 들자면, 공학수학에서는 푸리에 급수를 통해 sin과 cos만 가지고 어떻게 주기신호를 만들어내는지 시뮬레이션을 해보기도 하고, 신호 및 시스템에서는 DFT, FFT, Z변환, 샘플링을 직접 해보기도 한다. 통신시스템에서는 푸리에 변환을 이용해 AM, FM, ASK, FSK, PSK, QAM 등 각종 변조방법을 구현해보기도 하며, 제어공학에서는 라플라스 변환으로 시스템 모델링을 하기도 하고, 영상처리에서는 바코드인식, 얼굴인식, 필체인식 등 여러 실험을 해보기도 한다.
기계공학과 출신들은 보통 MATLAB과 각자 속한 분야에 따라 embedded C, C++, FORTRAN 등의 언어를 혼용해서 사용한다. 기계공학 분야에서 중요한 것은 legacy 코드와 호환성, 하드웨어에 이식 및 실행할 때의 성능이지 코드를 편안하게 (혹은 우아하게) 개발하는 것이 아니다. MATLAB/C/FORTRAN 등 프로그래밍 언어 자체로만 판단했을 때 상대적으로 우아하지 못한 '''수치해석/과학/공학용 프로그래밍 언어들이 여전히 널리 쓰이는 것'''은, '레거시 코드에 손 대봤자 논문 쓰기는 힘드니 시간 아까운 짓 안 하는 거'거나 특정 하드웨어에 밀접하게 관련이 되어 있어서 바꾸는 데 엄청난 비용/시간이 들기 때문이다.
의료공학과에서는 생체신호처리 및 의학영상처리[9] 에 사용한다.
컴퓨터공학과의 경우는 거의 다루지 않는다. 특별히 수치해석 분야나 하드웨어 계열(어찌보면 전자공학과에 가까운 내용이다... 신호에 대한 과목이라거나...)의 전공선택 과목과 진로를 고르는 경우에만 MATLAB을 접할 수 있을 것이다.
2.1.1. 공대 대학원
MATLAB 툴박스가 잘 갖춰진 것은 사실이지만, 분명히 한계가 있다. MATLAB을 쓰더라도 알고리즘에 대해서는 대개 박사, 빠르면 석사 때부터 직접 코딩을 해야 한다 [10] .
MATLAB이 주로 사용되는 공대 대학원에서는 개발 환경이 연구자가 코드를 작성할 때 느끼는 편리함/효율성 보다는 외적인 요소에 크게 영향을 받는다. 대학원생의 목표는 코드를 더 좋게 만드는 것보다는, 새로 개발한 알고리즘을 기존 코드에 통합해서 성능을 검증하는 것이 중요한 경우가 많다. 마음만 먹으면 MATLAB보다 더 나은 프로그래밍 환경에서 개발할 수 있다는 말은, legacy 코드(과거로부터 내려오는 코드 결과물)가 없이 맨땅에 헤딩하는 경우인데 이는 석사과정이나 박사과정 초반에 해당하는 매우 초보적인 연구개발(혹은 연구개발 수준에도 못 미치는 대학교/대학원의 수업 과제 수준)일 때나 유효하다.
대개는 대학원 연구실 내에서 축적되오던 수만줄짜리 legacy 코드가 C, FORTRAN, MATLAB 등으로 작성되어 있다. 실제 업무에 투입된 대학원생은, 선배들의 코드를 100% 이해하고 다른 언어로 변환하는 위험한 짓을 하는 대신에, 구석기 시대의 컴파일러를 모시고 살거나, F2C, CMEX/FMEX 등의 가능한 모든 포팅 방법을 이용해서 어떻게든 코드 번역을 피하기 마련이다. for문 개념도 정확하게 정립이 안된 FORTRAN66(goto문이 난무하는 50년된 고대 유물)도 노려보면서 포팅 작업을 해야하는 경우도 있다.
여러 불편함을 감수하는 것은, legacy 코드의 내용이 수학/물리/공학이론을 포함하고 있으며, 이론에 대한 적절한 이해가 없이 직접 개발하고 또 이를 정확하게 검증하는 것이 매우 어렵기 때문이다. 50년 전의 이론을 빠삭하게 공부하고 이를 최신 프로그래밍 언어로 멋있게 다시 쓰는 것보다는, 인터페이스만 적절히 개발해서 포팅을 하고 50년 전의 이론을 쳐다 보지 않는 편이 훨씬 빠르고 효율적이다.[11]
공학 분야 학부 졸업생들이 처음 대학원에 왔을때, MATLAB 쓰는 걸 이해 하지 못하고 쓰고 싶은 언어를 쓰고자 하는 경우가 매우 많다. 보통 소프트웨어학과 등에서 C++중점으로 배웠고, 또 그러면서 MATLAB이 C++나 Python 등 보다 열등 하다고 생각 하는 경우가 공학도들 사이에 파다한 생각이다. 하지만 위에서의 설명에서와 같이, MATLAB은 새로운 이론이나 방법론을 프로토타입하는데에 최적화 되어 있고, 해당 연구실에서 이미 쌓아놓은 수많은 코드들을 사용하기 위해서는 결국 MATLAB을 써야 한다는 걸 깨닫고 돌아온다. 포닥이나 교수들 입장에서는 매번 새 학생이 들어올 때마다 거쳐야 하는 과정 중 하나이다.
2.2. 상경 및 인문계
이공계에서만 사용할 것 같지만 인문사회계열 언어학과의 음성학수업이나, 경제학과의 거시경제학(대학원), 계량경제학(대학원) 같은 수업에서도 사용된다.
우선 경제학과 대학원에서는 MATLAB을 쓰는 과제가 나가기 때문에 석박사 생각이 있다면 일찍부터 MATLAB을 배워둬야 한다.
언어학과의 경우에도, 석박사 생각이 있다면 프로그래밍은 상당히 중요시 되는 능력이기 때문에 익혀두어야 한다. 특히 자연어처리분야나 음성음운론 분야에서는 MATLAB와 파이썬은 점차 기본소양이 되어가는 추세이다.
2.3. 타 프로그래밍 언어 및 소프트웨어와의 비교
- 엑셀: 프로그래밍에 익숙하지 않거나 계산이 간단하다면 당장 MATLAB 코드를 두드리기보다 엑셀을 여는 것이 더 빠를 것이다. 하지만 계산이 복잡해지면 엑셀로 코딩하는 것은 비효율적이고, 시각화 기능도 다양하지 못하다. 간혹 엑셀로 편미분방정식(!)을 푸는 고수들도 있기는 하지만 굳이 이럴 필요는 없고 그냥 매트랩을 쓰는 게 낫다. 더군다나 계산해야 할 데이터가 너무 많다면 엑셀이 뻗어버릴 수 있다.
- C: 전자공학전공의 소프트웨어 개발의 주언어인 만큼 많이 사용된다. 주로 MATLAB 프로토타입 코드를 기반으로 C언어 코드로 재구현하는 형태로 개발하게 된다. MATLAB으로 만든 프로토타입 알고리즘을 C로 자동포팅하는 것은 거의 사용하지 않는다.
- C++: 금융공학이나 상용 어플리케이션 개발처럼 빠른 속도가 요구되는 경우 C++이 낫다. C++도 간편한 라이브러리가 많이 나왔다. 하지만 C++은 기본적으로 번거롭기 때문에[12] 다수의 인원이 투입되고 이미 검증된 알고리즘을 최적화하는 프로젝트에 자주 사용될지라도 개인이 어려운 공학 공부를 하면서 사용하는 경우에는, 메모리 관리까지 신경써야 하는 불편한 점을 감수하기 힘들다. 현업에서 MATLAB 라이브러리 및 MATLAB DLL을 사용하는 경우가 생각보다 많은데, MATLAB이 JVM 기반으로 개발되어 있기 때문에, 수많은 에러를 뚫고 개발을 진행하게 되며, C/C++로 옮기는 이유인 성능향상의 이유가 퇴색되어 버리는 경우가 많다. 또한 MATLAB의 경우 기본적으로 허수를 가지고 있기 때문에, 허수를 놓치는 경우가 많으므로 주의가 필요하다.
- Java: 딱히 비교/경쟁 대상이 아니다. 자바는 안드로이드 앱 개발, 웹 개발, 서버 사이드 프로그래밍 등 많은 곳에서 애용되지만 MATLAB와는 달리 공학, 과학적 계산을 목표로 할때는 별로 쓰이지 않는다.
- 포트란: C/C++와 마찬가지로 오래된 언어라 코드 짜기가 번거로운 대신 속도가 빠르다. 전산유체역학 등 속도가 매우 중요한 분야에서는 아직도 현대화된 FORTRAN을 쓰는 경우도 있다.
- Python: 유명 라이브러리를 사용할 수 있다. SciPy, NumPy 등의 수치해석 패키지로 선형대수 계산을 할 수 있고, matplotlib으로 시각화를 할 수 있다. MATLAB이 주요 알고리즘을 다 바이너리로 만들고 m-file을 wrapper만 남겨놓는 등 속도 향상을 위한 노력을 많이 해서 Python보다 빠르다고 했지만, NumPy 패키지도 기본 루틴은 C로 짜여 있고, 속도는 지금도 앞으로도 꾸준히 논란거리일 것이다. 오픈소스 개발자들이 많은 함수명을 MATLAB과 비슷하게 작명하였기 때문에 둘 중 하나만 잘 배워도 나머지를 익히기는 쉽다.
다만, 유명 라이브러리를 사용하지 않고 Python 자체나 Python의 공식 라이브러리만 사용해야 한다는 특수한 조건[13] 이 붙는다면, 수치해석에 최적화되어 있지는 않다. 가령 Python에서 두 2차원 배열의 합이나 곱은 행렬합이나 행렬곱이 아니라 배열의 끝에 다른 배열을 갖다 붙이는 기능이다.
- R: 가끔 MATLAB 대용으로 쓰인다. 다만 R은 아무래도 통계분석에 특화된 느낌이 강해서 완전히 MATLAB을 대체하기는 힘들다.
- Julia: Julia의 탄생 목적 중 하나가 과학, 공학을 위한 수치 해석용 언어이기 때문에 MATLAB의 좋은 대안이 될 수 있을 것이다. MIT에서 수행한 벤치마크에서 MATLAB을 성능으로 뛰어넘기도 하였다. 다만 2012년에 발표된 신생 언어이기 때문에 라이브러리가 모두 개발되고 성숙하기까진 시간이 걸릴 것이다.
대체로 계산 과학 관련 커뮤니티 에서 MATLAB은 부동소수점을 이용한 수치계산에서 매스매티카보다 더 빠른 속도를 보이고, 매스매티카는 부정적분 해석, 다항식 풀이 등 수식 해석에서 MATLAB보다 성능이 더 뛰어나, 일장일단이 있다고 동의하는 분위기이다.
시뮬레이션 코드를 실행하는 속도나, 제품의 실제 개발이 더 중요한 연구에서는 해석적 방법보다는 수치적 방법을 쓰게 되므로 MATLAB이 더 유용하다. 공대 연구나 기업에서는 대부분 이쪽이다.
다만 학부 수준에서는, 아무리 공과대학이라도 배우는 내용은 죄다 이론이나 수식 전개이고, 수치해석 용으로도 스케일이 큰 문제를 풀어야 할 일은 절대 없기 때문에 매스매티카나 메이플을 사용한다고 특별히 부족한 기능은 없을 것이다. 심지어 많은 공대 학부생들이 솔루션을 찾아 다닌다고 Wolfram Alpha를 쓰는 것을 보면, 매스매티카가 더 유용할 지도 모른다. 다만, 대부분의 대학교 공과 수업은 매스매티카보다 MATLAB을 선호하는 편이다.
속도 논란에 관해서는, 물론 매스매티카가 다중 적분식으로 가면 느려지긴 하는데, 그건 MATLAB이 정확도를 크게 요구하지 않다 보니 항을 100분할 정도 해서 그냥 사다리꼴 등으로 계산해버리는 편법을 써서 그렇다. 공학적인 측면에서는 다수의 경우에 수학적인 엄밀함을 지키는 것보다, 다소 어기면서 계산적인 효율성을 추구하는 것이 더 낫다.[15]
시뮬레이션 코드를 실행하는 속도나, 제품의 실제 개발이 더 중요한 연구에서는 해석적 방법보다는 수치적 방법을 쓰게 되므로 MATLAB이 더 유용하다. 공대 연구나 기업에서는 대부분 이쪽이다.
다만 학부 수준에서는, 아무리 공과대학이라도 배우는 내용은 죄다 이론이나 수식 전개이고, 수치해석 용으로도 스케일이 큰 문제를 풀어야 할 일은 절대 없기 때문에 매스매티카나 메이플을 사용한다고 특별히 부족한 기능은 없을 것이다. 심지어 많은 공대 학부생들이 솔루션을 찾아 다닌다고 Wolfram Alpha를 쓰는 것을 보면, 매스매티카가 더 유용할 지도 모른다. 다만, 대부분의 대학교 공과 수업은 매스매티카보다 MATLAB을 선호하는 편이다.
속도 논란에 관해서는, 물론 매스매티카가 다중 적분식으로 가면 느려지긴 하는데, 그건 MATLAB이 정확도를 크게 요구하지 않다 보니 항을 100분할 정도 해서 그냥 사다리꼴 등으로 계산해버리는 편법을 써서 그렇다. 공학적인 측면에서는 다수의 경우에 수학적인 엄밀함을 지키는 것보다, 다소 어기면서 계산적인 효율성을 추구하는 것이 더 낫다.[15]
- GNU Octave: 비싼 라이센스 가격의 MATLAB을 대체하기 위해 가장 대표적인 언어. MATLAB과 문법 차이점이 적어 적응하는 데 시간이 많이 걸리지 않는다는 장점이 있다. 하지만 성능이 나쁘고 툴박스의 편리함을 누릴 수도 없으며 문법 역시 미묘하게 차이가 나서 완벽하게 이식 가능한 것도 아니라는 단점이 있다.
- SciLab: 신호 처리 등에 대체 가능하다. 단 SciLab은 Octave에 비해 MATLAB 문법 호환성이 다소 낮다.
- Verilog, VHDL: MATLAB의 자동 코드 생성 기능을 사용해 Verilog나 VHDL 코드를 생성하는 경우도 있지만, MATLAB으로 시스템을 프로토타이핑한 후 직접 HDL 코드를 짜서 하드웨어를 구현하는 경우가 많다.
특히 라이센스가 GPL일 경우 상업적인 개발에 사용한다면 카피레프트에 주의해야 한다.
3. 역사
1970년대에 뉴멕시코 대학의 컴퓨터공학과의 학장인 클리브 몰러의 주도 아래 개발이 시작되었다. 1984년 본격적으로 Mathworks 사를 세우고 개발하여 2000년대에 처음으로 일반 사용자에게 판매되기 시작하였다.
4. 특징
일반적인 프로그래밍 언어에서 행렬은 그저 각 차원으로 이루어진 방식으로, 현실의 행렬 계산 방식과는 거리가 있다. 그에 따라 각 행렬에 대한 값을 구하려면 그 부분 역시 유저들이 직접 알고리즘을 짜서 계산해야 한다. 문제는 공학이 대부분이 행렬 계산 위에 성립된 학문이라 행렬 계산이 불편한 일반적인 프로그래밍 언어는 공학계열에서 사용하기 어렵다.
C/C++나, 이후 개발된 Java도, 다목적 용도를 가지고 개발되었기에 공학용으로 디자인된 수식을 계산하기 위해선 공학도들이 알고리즘에 숙달될 필요가 있었다. 하지만 각 공학과의 현실상 가르치기 어려웠으며 커리큘럼도 만들어져있지 않았다. 또한 컴퓨팅 파워 역시 1990년 이전에는 부족하여 공학 계산과 시뮬레이션에 있어 필요성은 절대적이었으나 유용 방식은 한정되었다. 또한 포트란 등의 단순 계산에 적합한 언어들는 그 나름의 장점이 있었으나 병렬계산에 적합하지 못했다.
그러나 MATLAB은 공학과 시뮬레이션에 특화된 언어라는 목적을 가지고 개발되었다. 그에 따라 시간과 (자금적) 리소스를 크게 사용하지 않는 기존 언어와 다른 개념으로 개발된다. 그건 바로 쓰일 만한 명령어 세트는 죄다 컴파일러로 이루는, 비효율적이나 사용자 입장에선 쉬운 방법을 택한 것이다.
또한 기존 언어와의 차이점으로 모든 정의한 변수는 행렬 취급이 된다. 이는 공학계에서 수많은 변수들을 간편화하기 위해 행렬을 사용하기 때문이다. 심지어 문자열도 그저 문자(char)들의 행렬로 취급되었다.[17]
MATLAB이 처음 사용자용으로 발표된 2000년도에는 컴퓨팅 파워의 한계와 보급의 난항으로 주목받지 못했다. 그러나 곧 컴퓨터가 빠르게 보급되었고, 매트랩은 사용과 교육의 간편함에서 주목받아 공학도들이라면 한 번씩 만져본 프로그래밍 언어가 되었다.
4.1. 장점
- 설치가 쉽다. 리눅스나 각종 프로그래밍 언어의 패키지 관리 시스템에 익숙하지 않고도, MATLAB 설치 관리자만 실행시키면 알아서 다 해 준다. 이것은 상업적 솔루션의 장점이기도 하다.
- 문법이 쉽다. MATLAB 언어 자체는 사칙연산과 행렬연산, 행렬 인덱싱과 슬라이싱, 함수 사용, 기초적인 객체지향과 람다 대수 지원 등이 프로그래밍 문법의 거의 전부로, 이후로는 각종 툴박스의 API 문서만 검색해서 읽어보면 다른 누군가가 작성한 MATLAB 코드를 이해하는 데 문제가 없다.
- 컴퓨팅 리소스는 많이 먹지만 컴파일러에 박혀있는 명령어 세트가 워낙 많아 개념 검증 시, 시간과 비용을 절약할 수 있다. 이는 복잡한 시스템 개발에 적용되는 공학적인 알고리즘 개발에서 프로토타이핑에 가장 유용한 특징이다. 복잡도가 높은 시스템은, 서드 파티 HW 및 SW가 매우 다양하게 함께 작동한다. 이러한 경우, 시스템의 복잡도 때문에 새로운 아이디어는 working-prototype을 구현 해보기 전에는 가능한지 아닌지 여부를 예단하기가 거의 불가능하다.[18] 이러한 GO/NO-GO 타입의 의사결정에서, 최소한의 시간과 노력으로 알고리즘을 구현하고(코드가 얼마나 지저분하고 비효율적으로 만들어졌는가와는 별개로) 써드파티 HW/SW와 함께 새로운 알고리즘이 의도한 대로 작동하는 보는 것은 매우 중요하다. 자동차/비행기/위성 개발과 같이 엄청나게 많은 숫자의 서드 파티 HW/SW가 함께 작동하는 경우에는 대부분은 특정 엔지니어가 코딩을 잘하고 잘 못하는 것보다는 시스템 내의 여러 HW/SW와 내가 새롭게 개발한 알고리즘이 잘 어울리는지가 우선적으로 중요하다. 개념이 외부 요소들과 잘 작동하는지를 검증한 이후에야 알고리즘 최적화가 의미가 있는 것이다. 학교 외에 비싼 MATLAB을 사서 제공한다면, 상기한 이유 때문에 프로토타이핑을 통한 개념 검증은 MATLAB으로, 개념 검증 후 실제 개발은 아마도 C/C++이나 Java로 하게 될 것이다.
- 작성한 코드를 m-file로 저장이 가능하며, 이 m-file은 명령창(command window)에서 바로 명령어(스크립트 파일의 경우)나 함수처럼 쓸 수 있다. 심지어 다른 m-file 내에서도 쓸 수 있어서 작업이 상당히 편해진다.
- 디버깅이 쉽다. 이는 인터프리터 언어의 특징으로 장점과 동시에 단점이 되기도 한다. 한 줄씩 코드를 읽어들이며 기계어로 번역하기에 에러가 발생하는 코드까지 진행해서 원인이 되는 줄을 찾을 수 있다.
- 공대 학부생의 프로젝트에서는 프로그램 짜기가 아니라 간단한 시뮬레이션의 결과를 내기 목적이다. 이때는 MATLAB을 쓰면 더 시간이 절약된다. 매스매티카는 정확한 결과를 내지만, 대부분의 공학 관련 문제는 순수수학에서 요구하는 정확도는 필요 없다. 무엇보다 교수들도 학부생들이 매스매티카를 만지는 것까진 기대도 안하고 매트랩만 좀 만져도 감지덕지인지라...
- 애플리케이션으로의 특징은, MATLAB용으로 개발된 여러 가지 패키지(프로그램 모음)를 이용하여 그래프 작업이나 미분방정식 계산, 또는 신호 처리 같은 계산을 수행할 수 있다는 것이다. 이런 작업들은 자신이 직접 프로그램 언어로 구현하려면 매우 어렵다.
- 또한 데이터 시각화(그래프를 그린다거나, 이미지를 띄운다거나 등등) 및 시각화 된 데이터를 검토하는 기능이 잘 구비되어있다. 코드 몇 줄이면 논문에 넣을 퀄리티의 그림 정도는 뚝딱 그릴 수 있다. 물론 시각화 코드에 익숙하지 않으면 GUI 인터페이스를 통해 그림을 커스터마이즈 할 수 있다.
- CMEX, FMEX 등의 함수로 C나 포트란으로 짜인 함수의 결과값을 불러올 수 있다. 이를 이용해 기존에 있는 라이브러리를 활용할 수 있으며 MATLAB 스크립트의 병목구간을 mex로 구현하면 속도 문제를 상당히 개선할 수 있다. 신경을 조금만 쓰면, 아예 윈도우 MEX인터페이스를 통해서 dll 파일들을 불러다 쓰는 것도 가능하다.
- MATLAB 코드를 C 파일로 컴파일할 수 있다. 이 바이너리를 매트랩에서 다시 불러올 수 있다. 따라서 최적화가 필요한 부분을 C 바이너리로 돌림으로써 웬만한 프로그래밍 언어 못지않은 속도를 기대할 수 있다. MATLAB을 문제 해결 및 알고리즘 개발용으로 활용할 때 큰 잇점이 된다.
- 모든 연산을 행렬 연산으로 프로그래밍할 수 있다면, MATLAB은 매우 강력하다. 행렬연산에 LAPACK을 사용하기 때문인데, 장담컨대 생각없이 C로 짠 행렬연산 루틴보다 몇 배는 빠르다. 그래서 MATLAB 입문자들에게는 튜토리얼 때 가능한 한 벡터화(vectorization)라는 테크닉을 사용하도록 가르친다. 이름은 거창해 보이지만, 단순히 for, if, while 대신 매트랩에서 자체 지원하는 함수들을 사용한다고 생각하면 편하다. for이나 while 루프는 그 구조상 순차적(sequential)으로 처리할 수밖에 없지만, 매트랩의 행렬 관련 연산들은 병렬(parallel) 연산을 지원하기 때문. 효율이 몇십~몇백 배 이상 증가한다.
- Parallel toolbox를 활용해 쉽게 병렬 처리를 구현할 수 있다.
- 초보적인 수준의 객체 지향 프로그래밍을 지원한다.
- 신호 처리나 이미지 처리를 비롯한 여러 공학적 문제 해결에 유용하다.
- 자동 C코드 생성 기능을 이용해 임베디드 C 등 다른 언어로 변환하여 실행 속도를 높이거나 임베디디 기계에 직접 이식할 수 있다.
- 많은 전공 서적과 논문들이 MATLAB 코드를 사용하며, 심지어 기본적인 튜토리얼까지 담고 있는 경우가 많다.
- 명령어 help를 통해 간편하게 사용법을 숙지할 수 있다.
- Mathworks 홈페이지의 문서가 굉장히 충실하다. 그리고 이는 MATLAB에 내장된 Documentation에도 그대로 반영되어 있어서 많은 도움이 된다.[19] 만약 어떤 기능을 하는 함수를 알고 싶은데 모르겠다 싶으면 일단 여기에 떠오르는 단어를 검색해보자. 그러면 조금이라도 연관있는 건 뭐든 뜬다. 만약 여기 없으면 진짜 없는 거니 더 찾느라 시간 낭비 할거 없이 원하는 기능을 만족하는 스크립트를 짜면 된다. 한국어 번역도 있다.[20]
- 1년에 두 번씩 꾸준히 신버전을 출시하며 지속적으로 기능을 향상시키고 있다.
- 가장 최신의 버전은 물론이고 구버전까지 다운로드 및 설치가 가능하다. 그것도 20년 전도 더 넘어가는 버전까지 지원한다!
4.2. 단점
- 느리다. 무지막지한 명령어 세트를 가지고 있는 인터프리터 언어이기 때문이다. 따라서 아무리 효율적으로 짜도 [21] 가상머신 위에서 돌아가는 Java보다 느리다. 많은 기능의 수를 감안하더라도 빠른 편은 아니다.
- 재배포 패키지가 엄청나게 크다.(대략 1.8기가)
- 구버전의 경우 프로세스 및 서비스에 올라가서 웜바이러스 못지않은 컴퓨터 성능하락을 보였었다.
- 명령어 세트가 그냥 무식하게 때려박힌 구조라 필요한 헤더만 선언하여 최적화를 할 수가 없다.
- 유료인 데다 가격도 비싸다.
- 객체 지향 프로그래밍을 지원하지만, 다른 객체지향 전문 언어들에 비해 매우 기초적인 패러다임만 지원한다.
- 간단한 행렬 연산을 루프, 즉 for, if, while 문으로 써서 만든다면, 무지막지하게 시간이 걸린다. 일단 2015b 버전 이후로는 엔진 최적화에 신경을 쓰었는지, 스크립트를 실행하는 과정에서 Just-In-Time 컴파일을 도입하여 루프를 사용한 행렬 연산의 속도가 많이 개선된 편이다. 다만 MATLAB에서 슬라이싱이나 arrayfun등의 기능을 쓰지 않고 반복문을 쓰는 경우는 꼭 필요하다기 보단, 좋지 않은 코드일 확률이 높다. 특히 C 같은 다른 프로그래밍 언어를 대충 배우고 MATLAB에 입문해 언어마다 적용되는 고유의 패러다임을 잘 이해하지 못할 때 하기 쉬운 실수이다.
- 코드 파일 하나에 함수를 하나씩만 만들 수 있다. 간단한 함수조차 죄다 새로운 파일에 선언해야 해서 번거로워진다. 람다식이나 클래스를 이용해 잡다한 함수들을 정리할 수 있지만, 한계가 있다.
- 위의 단점들 때문에 쉽게 초보자가 조금만 복잡한 프로그램을 짜면 쉽게 스파게티 코드가 된다.
- 기본 함수들의 이름이 너무 짧고, 직관적이지 못하다. 함수명만 보고 eye가 단위행렬을 생성하는 함수인지, angle이 복소수의 phase angle인지 등등 수학적인 의미를 추론하기 힘들다. 그리고 fft가 1차원 고속 푸리에 변환이면 fft2가 2차원 고속 푸리에 변환인 것도을 보면 마치 공대생 센스로 대충 이름을 지은 듯하다. 다만 이런 문제는 LAPACK 같은 라이브러리들보단 덜 심하다. 그리고, NumPy 등 최신 라이브러리들도 MATLAB식 작명법을 따라가는 중이라, 오히려 이것이 정석이 될지도 모른다.
- 오픈 소스가 아니고, 소스 코드가 기업 비밀이라 MATLAB의 거의 모든 함수들의 코드를 뜯어볼 수 없고, 이는 MATLAB으로 작성된 코드는 과학의 기본 중 하나인 재현 가능한 연구에 어긋날 수 있다. 전세계에서 많은 사람들이 개발 과정을 부분적으로나마 주시하는 오픈소스 과학 라이브러리들도 신기능 개발이나 혹은 리팩토링 과정 중에 실수를 하는 경우가 종종 있는데, MATLAB의 개발진이 아무리 전문성을 가지고, 또한 돈을 받고 개발하는 의무를 가지고 개발한다 할지라도 사람인 한 실수를 할 수 있다는 의심을 해야 한다. 그래서 언제든 소스 코드를 확인할 수 있는 오픈 소스 라이브러리 사용에 비해 불투명하다. 이는 매스매티카도 가진 문제이다.
- 다른 범용 프로그래밍 언어를 배우는 것에 비해 취업에 도움이 되지 않는다. MATLAB 프로그래밍 능력을 요구하는 경우 대부분 동시에 석박사 학위를 요구하며, 학부 졸업생이 취업할 수 있는 일반적인 Software Developer 직무에서 요구되는 코딩 테스트 언어로 MATLAB이 채택되는 경우는 거의 없다. 그래서 대학원 진학에 진지한 생각이 없다면 MATLAB을 깊이 파는 것은 그렇게 추천하기 힘들다.
- 신버전을 꾸준히 출시하는 것은 좋지만, 새로운 기능들을 제대로 누리려면 이전 버전을 지우고 새로 깔아야 하는 번거로움이 있다.
- 기능 업데이트가 될 때마다 시스템 최소 및 권장 요구 사항이 계속 올라가기 때문에 최신 버전일수록 프로그램이 무겁다. 데스크탑(특히 조립 컴퓨터)에서는 그리 부각되는 단점이 아니지만 랩톱에서는 주의할 필요가 있다.
5. 비싼 가격
- Standard License: 상업 버전. MATLAB을 이용한 이윤이나 수익 창출에 제한이 없다. 한 명만 인증되며 최대 PC 네 대에 설치할 수 있다. 영구보유에 260만원이나 한다. 거기에다 툴박스는 또 따로 사야하고 하나당 백만원이 넘어간다.
- Education: 학술기관(대학/대학원) 직원이나 연구자가 보유할 수 있는 라이센스. 영구보유에 50만원이다. 물론 툴박스 별도.
- Student: 보통 학생용은 기능을 제한하는 대신 싸게 판다. 상업 버전이 툴박스 하나에 1,000불인 것이 함정. 2019년 1월 현재 학생용은 툴박스 10개가 포함된 MATLAB and Simulink Student Suite가 $59이고 애드온 및 툴박스는 최초에 같이 구매할 때 한정으로 개당 $5에 판매하고 있다. 별도로 구매할 때는 개당 $18. 거기에다 무기한 유효라는 모양. 옛날에는 한화 15만원, 미국에서는 50불에 툴박스 10불에 팔았다.
- Total Academic Headcount: 공대생이나 공대 대학원생이라면 학교 내지는 연구실에서 라이센스를 사줬을 경우 재학 및 휴학중에는 무료로 사용이 가능하다. 단 졸업하면 권한이 없어진다.
- Home License: 미국에서는 저런 제약 없이 영구적으로 사용 가능하고 가격도 비교적 저렴한 홈 라이센스가 존재하지만 한국에서는 판매하지 않았다가 R2020b 버전부터 usd 99 가격으로 판매하고 있다. 링크 설치는 컴퓨터 두 대까지만 가능하다.
- MatLab Online: 본인에게 유효한 라이센스가 있으며 컴퓨터가 인터넷에 연결된 상태여야만 실행이 가능하다. 거기에 일정 시간 입력이 없으면 자동 로그아웃이 되는 등 불편한 점이 많다.
- MATLAB Mobile: 안드로이드, iOS를 지원하고 MathWorks 계정만 만들면 무료로 깔아서 쓸 수 있다. 하지만 툴박스를 지원하지 않는 등 기능이 꽤 제한적이다. 본인에게 유효한 라이센스(Total Academic Headcount도 해당됨)가 없을 시에는 센서를 이용한 데이터 입력 및 애드온이 지원되지 않는다.
게다가 한국의 이용자들에게는, 중간에 웬 브로커가 개입했는지 Home License 자체를 구할 수 있는 방법이 없었지만 R2020b 버전부터 usd 99 가격으로 구입이 가능해졌다. 즉, 학교를 졸업하고 나면 260만원 정도 하는 Standard License를 사거나 십만원 남짓하는 Home License를 사지 않는 한, 공대 재학 중에 작성한 MATLAB 코드는 모두 Octave로 이식해야 하고, 아니면 휴지조각이다.
이런 점은 개인 이용자들이 MATLAB을 배우거나, 공학 관련 지식을 공부하는 데 주저하게 만드는 요인이기도 하다.
요즘은 각종 프로그래밍용 IDE나, 그래픽 편집 툴, 게임 엔진, CAD같은 과거에는 개당 몇백만원씩 비싸게 팔던 전문 툴들도 비상업적 이용 용도로는 무료 라이센스를 제공하고, 인디 개발사들에게 저렴한 라이센스를 제공하는 경우도 많다. 그리고 이 방법이 학생들이나 개인들이 불법복제에 손을 대는 빈도를 줄이고 MATLAB 언어의 점유율을 높일 수 있는 방법이다.
MATLAB 라이센스는 무척 비싸기 때문에 회사나 연구소 컴퓨터에 크랙 버전을 설치하거나, 설치된 개인 노트북을 들고 오지 말아야 한다. 불법은 물론 Home License같은 비상업적 라이센스까지 포함이다. 링크와 같이 한번 걸리면 큰일난다. 특히 크랙 버전의 경우 각종 툴박스를 모두 깔아버린다면 무시무시한 배상금을 물게 된다.
Mathworks는 한국 지사도 가지고 있으므로, 특히 더 조심하자. 알다시피 외국계 엔지니어링 기업이 한국에 지사를 가지는 이유 중 하나가, 이런 단속이나 법적 분쟁을 통해 이익을 남기기 위해서이다.
DRM이 깔려 있는걸로 추정된다. 불법설치던 Trial Version이던 설치를 하면 귀신같이 불편한 내용이 없는지 확인메일이 날라오고, 전화도 온다. 또한 최악의 경우 소프트웨어 감사가 온다.
크랙버젼으로 풀패키지를 사용할 경우 풀패키지 가격이 1억이 넘어감으로 기업에서는 되도록 정품이나, 스탠다드 에디션에 필요한 툴박스만 사서 사용하고, 부득이하게 크랙버젼을 사용하다가 감사가 나오면, 창문 밖으로 컴퓨터를 던져버리는걸 추천한다.
6. 기타
MATLAB 계산 엔진도 나날이 발전하는 중이어서, 코드만 효율적으로 짠다면 아주 답답하지 않을 정도로는 최적화할 수 있다. 어떻게 코드를 효율적으로 바꿀 수 있는지도 가이드하는 기능도 있다.
MATLAB 자격증도 있다. 2017년 자격증 시험 기준 응시료는 45만원. 자격증 응시료가 비싼데 ## 실제로 비용에 비해 얼마나 효용적인 자격증인지는 의문이다.
컴퓨터공학 쪽에서 많이 사용하는 각종 프로그래밍 언어가 유행을 탄다는 것은, 프로그램의 인터페이스 대상(유저, 핸드폰, 인터넷 하드웨어)이 끊임없이 변한다는 속성을 가지고 있기 때문이다. 그렇기 때문에 여러가지 시도가 이루어지고 또 프로그래밍 언어 자체가 발전할 수 있는 계기가 된다.
2020년 전까지는 라이젠 등 AMD에서 만든 CPU를 쓴다면 동급의 인텔 CPU에 비해 매우 낮은 속도를 경험해야 했었다. 이 이유는 매트랩에서 사용하는 인텔 MKL 라이브러리에 있는데, 인텔 CPU가 아닌 CPU에서는 빠른 최신형 명령어가 아닌 가장 느린 구식 명령어를 쓰도록 만들었기 때문이다.[22] MKL의 비공식 플래그를 사용해 이를 우회하는 방법이 2019년 12월에 매트랩 레딧에서 알려졌다.(레딧 링크, 한국어 소개) 적게는 20%에서 많게는 300%까지 성능 향상이 있는 것으로 알려지고 있으며, 이 간단한 패치를 적용할 경우 벤치마크 상으로 스레드리퍼는 인텔 i9-10980XE보다 전반적으로 나은 성능을 보여준다.[23]
결국 MATLAB R2020a로 넘어가면서 Ryzen 시리즈에서도 기본적으로 AVX2를 쓰도록 개선이 이루어졌고, 추가적인 최적화 또한 이루어져서 동코어 기준 AMD Zen2 기반 CPU가 인텔을 앞서는 결과를 뽑아내게 되었다.
7. 관련 문서
[1] 적지 않은 숫자의 컴공과 학부생들이 어플리케이션 SW로서의 MATLAB 특성을 이해하지 못하고 MATLAB의 스크립트 인터페이스에 대한 불만을 가지고 있다. [2] 프로그래밍 기능이 있는 공학용 계산기를 떠올리면 비슷하다.[3] 행렬 계산, 그래프 만들기, 여러 공학적 알고리즘 사용하기 등[4] 객체 지향 프로그래밍, 프로그래머가 여러가지 함수 만들기 등[5] 사실 이는 대학 측에서도 MATLAB을 한 학기동안 가르치는 과정을 마련하지도 않아 놓고는, 이것쯤은 할 수 있겠지 하면서 교수 재량으로 과제를 진행시키는 문제가 있다.[6] 항공우주연구원, NASA, 한국개발연구원(KDI), 현대자동차 등에서 MATLAB을 정식 구매하여 사용하는 것은 확인됨. 특히, 전세계 자동차 업계에서는 Simulink의 자동 C코드 생성에 많이 의존하고 있다.[7] 물론 전공 분야와 연구 분야에 따라 다르다.[8] 다른 언어는 서드 파티 라이브러리 정도나 있는 수준이다.[9] MatLab이 발달하지 않았던 시절에는 C++을 사용하기도 했으며, 현재는 딥러닝의 성장세에 힘입어 Python을 많이 사용하는 추세이다.[10] 물론, 몇몇 기초적인 프로토콜에 대한 알고리즘은 이미 나와 있는 경우가 많아 살짝 손만 봐서 쓰면 되니까 잘 찾아보시길.[11] 일반 상대성이론은 100년도 더 전의 것임에도 배우려면 머리가 아프며, 50년 전의 항공유체역학이론을 바탕으로 미국에서는 제트기가 날아다녔고, 50년도 전에 원자폭탄을 만들기 위해 했던 핵물리학적 계산들은 지금도 폭발 실험이 없이는 필요한 변수를 계산하지 못한다.[12] 그나마 선형대수 정도만 필요하다면, 표준 라이브러리에 가까운 BOOST/Ublas를 사용하면 되니, 할만하다. 하지만, 본격적인 수치해석을 제공하는 신뢰할만한 오픈소스 C++ 라이브러리는 없다.[13] 국내 대기업의 입사 코딩 시험을 준비할 때, 또는 Python 자체를 향상시키려는 오픈 소스 기여자일 경우로 국한된다.[14] 4차 방정식의 일반해를 계수에 대한 표현으로 나타내거나 다항식, 부정적분 등을 수식적으로 푸는 것.[15] 기계공학 분야에서는 일차적인 정확도가 확보된다면(ex. 80%) 그 이후에는 실행 속도가 더 중요한 경우가 대다수이다. 예를 들어 자동차 내부에 들어가는 전자 제어기는 제어기 특성에 따라 느려도 0.01초, 보통 0.001초마다 제어 결과 값을 산출하는 것이 제한 조건으로 적용되어 있다. 차체 내부의 제어기가 주어진 제어 주기를 만족하지 못하면, 엔진 사이클이 흐트러지거나, 차가 울컹거리는 거나, 조향이 이상하게 되는 것을 느끼게 된다.[16] 한/영 입력을 한글로 한 상태에서는 키보드의 어떠한 자음, 모음 키를 누른다 해도 아무것도 입력되지 않는다.[17] 다만 2017년부터는 객체지향이 가미된 진짜 string 형식이 도입되었다. s= 'Hello, world!'의 경우 기존에 존재하던 문자의 행렬(character array)을 선언하고, s= "Hello, world!" 는 새로 도입된 문자열(string)을 선언한다.[18] 즉, 내가 코딩을 잘 하고 잘 못하고는 별로 중요하지 않다. 내가 짠 코딩 방식이 다른 HW/SW와 잘 어울리는지 여부가 문제인 것이다. 하지만 몇 가지 규격문서 정도만 받은 엔지니어 입장에서는 여러 HW/SW의 작동 방식을 로우 레벨에서 전부 이해하면서 개발하게 되는 경우는 거의 전무하다.[19] 위에서 언급한 help 또는 툴바의 도움말로 들어갈 수 있다.[20] 단, 기본적이거나 사용 빈도가 높은 함수 및 명령어 위주로 번역이 있어서 그 외의 기능을 원한다면 영어로 된 설명을 읽어야 한다.[21] 제대로 코딩만 한다면 어셈블리어나 포트란 제외 하고는 보통 C가 제일 빠르다. 즉, MATLAB이 C보다 빠를 필요가 없다. MIT에서 수행한 Julia 벤치마크 정보 참고.[22] 이 문제는 무려 10~20년간 지속되어 온 문제로 이와 관련해 시정명령을 받았음에도 불구하고 이어지고 있다.[23] legitreview 벤치마크 및 ExtremeTech 벤치마크를 보면 패치 적용 전에는 9개 주요 연산 중 8개가 인텔의 우위로 나오나 패치 적용 후에는 7개에서 AMD의 우위로 나오며 전반적인 소요시간에서는 기존 벤치마크가 3960X < 10980XE < 3970X였던 반면 패치 이후에는 10980XE를 3960X로도 넉넉하게 이기는 것으로 나온다(10980XE보다 실행시간 약 35% 단축됨).