MATLAB

disp( 'Hello, world!' )
'Hello World!'
matlablogo.jpg

1 개요

Mathworks 사에서 개발한 공학용 프로그램 및 프로그래밍 언어이다. 2016년 10월 현재 R2016b가 최신 버전이며, 이름의 MAT는 수학(mathematics)이 아니라 행렬(matrix)에서 따왔다.

대부분의 미국 공대에서 처음으로 프로그래밍에 입문하는 학생들이 제일 먼저 배우는 프로그램이다. 프로그래밍 언어라고 볼 수도 있고, 애플리케이션으로도 볼 수 있으나[1], 쓰는 사람의 목적에 따라 두 가지 성격이 모두 나타나기도 한다. 현재 쓰이는 프로그래밍 언어 중 18위 정도로 사용자의 층이 두껍다.

국내에서도 이학 계열에서는 제법 쓴다. 프로그래밍 언어치고는 대단히 간편한 편이다. 그러나 프로 입장에서의 난이도는 아마추어에게 큰 의미가 없다. 프로그래밍에 전문적이지 못한 학생들이 논문을 위한 시뮬레이션을 하기 위해 접하는 경우 등, 급작스럽게 필요하여 사용하는 경우가 많아서 정통한 사람이 많지 않다. 그 때문인지 전공 지식이 부족해도 이 프로그램을 잘 다룬다면, 아니, 포기하지 않고 끈기 있게 붙잡고 늘어질 수만 있어도 대학원생 선배들이나 교수님들로부터 굉장히 이쁨받는다.(...)'

어찌보면 마지막엔 버림받는 프로그램이다. C++도 간편한 라이브러리가 많이 나왔다. 그리고 python이 요즘 대세다. 심지어 FORTRAN까지 (보통 이 단계 이전에 여러분은 학위를 받게 된다.) 마음만 먹으면 약간의 수고를 더해 모든 면에서 MATLAB을 압도하는 환경에서 작업할 수 있다.

프로그래밍언어이지만 컴퓨터공학도들에게는 철저하게 외면받는 언어.

특이하게 고려대학교 영어영문학과에서도 음성학, 특히 "음성 합성"에 대해 배울 때 MATLAB을 다룬다 (필수과목은 아니다) [2].

2 역사

1970년대에 뉴멕시코 대학의 컴퓨터공학과의 학장인 클리브 몰러의 주도 아래 개발이 시작되었다. 1984년 본격적으로 Mathworks 사를 세우고 개발하여 2000년대에 처음으로 일반 사용자에게 판매되기 시작하였다.

3 특징

일반적인 프로그래밍 언어에서 행렬은 그저 각 차원으로 이루어진 방식으로, 현실의 행렬 계산 방식과는 거리가 있다. 그에 따라 각 행렬에 대한 값을 구하려면 그 부분 역시 유저들이 직접 알고리즘을 짜서 계산해야 한다. 문제는 공학이 대부분이 행렬 계산 위에 성립된 학문이라 행렬 계산이 불편한 일반적인 프로그래밍 언어는 공학계열에서 사용하기 어렵다.

C/C++나, 이후 개발된 Java도, 다목적 용도를 가지고 개발되었기에 공학용으로 디자인된 수식을 계산하기 위해선 공학도들이 알고리즘에 숙달될 필요가 있었다. 하지만 각 공학과의 현실상 가르치기 어려웠으며 커리큘럼도 만들어져있지 않았다. 또한 컴퓨팅 파워 역시 1990년 이전에는 부족하여 공학 계산과 시뮬레이션에 있어 필요성은 절대적이었으나 유용 방식은 한정되었다. 또한 포트란 등의 단순 계산에 적합한 언어들는 그 나름의 장점이 있었으나 병렬계산에 적합하지 못했다.

그러나 매트랩은 공학과 시뮬레이션에 특화된 언어라는 목적을 가지고 개발되었다. 그에 따라 시간과 (자금적) 리소스를 크게 사용하지 않는 기존 언어와 다른 개념으로 개발된다. 그건 바로 쓰일 만한 명령어 세트는 죄다 컴파일러로 이루는, 비효율적이나 사용자 입장에선 쉬운 방법을 택한 것이다. 또한 기존 언어와의 차이점으로 모든 정의한 변수는 행렬 취급이 된다. 이는 공학계에서 수많은 변수들을 간편화하기 위해 행렬을 사용하기에 때문이다.

매트랩이 처음 사용자용으로 발표된 2000년도에는 컴퓨팅 파워의 한계와 보급의 난항으로 주목받지 못했다. 그러나 곧 컴퓨터가 빠르게 보급되었고, 매트랩은 사용과 교육의 간편함에서 주목받아 공학도들이라면 한 번씩 만져본 프로그래밍 언어가 되었다.

3.1 장점

  • C 언어 만큼의 효율성은 없으나 문법이 쉽다. 때문에 작은 규모의 계산이나 알고리즘을 테스트할 때 쓴다. 컴퓨팅 리소스는 많이 먹지만 컴파일러에 워낙 박혀있는 명령어 세트가 많아 개발할 때 시간과 비용을 절약할 수 있다. 테스트는 매트랩으로, 실제 개발은 C나 Java로 하는 경우도 많다.
  • 기본 에디터의 디버깅 기능이 굉장히 강력하다. 문법 오류 정도는 실시간으로 잡아주며 문제의 소지가 있는 코드 역시 찾아서 무엇이 문제인지 알려 준다. 또한 코드를 셀로 끊어주면 에디터에서 하나씩 실행 하면서 프로그램의 동작을 단계별로 확인할 수 있다. 브레이크 포인트? 당연히 쓸 수 있다.
  • 일부 공학대에서는 쉬운 문법에 주목해서 프로그램의 개념을 익히기 위한 입문용으로도 쓰인다.
  • 공대 학부생의 프로젝트에서는 프로그램 짜기가 아니라 간단한 시뮬레이션의 결과를 내기 목적이다. 이때는 매트랩을 쓰면 더 시간이 절약된다. 매스매티카는 정확한 결과를 내지만, 대부분의 공학 관련 문제는 이산수학 등의 순수수학에서 요구하는 정확도는 필요 없다.
  • 애플리케이션으로의 특징은, 매트랩용으로 개발된 여러 가지 패키지(프로그램 모음)를 이용하여 그래프 작업이나 미분방정식 계산, 또는 신호 처리 같은 계산을 수행할 수 있다는 것이다. 이런 작업들은 자신이 직접 프로그램 언어로 구현하려면 매우 어렵다.
  • 또한 데이터 시각화 (그래프를 그린다거나, 이미지를 띄운다거나 등등) 및 시각화 된 데이터를 검토하는 기능이 잘 구비되어있다. 코드 몇 줄이면 논문에 넣을 퀄리티의 그림 정도는 뚝딱 그릴 수 있다. 물론 시각화 코드에 익숙하지 않으면 GUI 인터페이스를 통해 그림을 커스터마이즈 할 수 있다.
  • CMEX, FMEX 등의 함수로 C나 포트란으로 짜인 함수의 결괏값을 불러올 수 있다. 이를 이용해 기존에 있는 라이브러리를 활용할 수 있으며 MATLAB 스크립트의 병목구간을 mex로 구현하면 속도 문제를 상당히 개선할 수 있다. 이는 python과 같은 다른 스크립트 언어 기반 프로그램에서 보다 나은 처리 속도를 얻기 위해 많이 쓰이는 전략이다.
  • 새로 나온 기능으로, 매트랩 코드를 C 파일로 컴파일할 수 있다. 이 바이너리를 매트랩에서 다시 불러올 수 있다. 따라서 최적화가 필요한 부분을 C 바이너리로 돌림으로써 웬만한 프로그래밍 언어 못지않은 속도를 기대할 수 있다. 매트랩을 문제 해결 및 알고리즘 개발용으로 활용할 때 큰 잇점이 된다.
  • 모든 연산을 행렬 연산으로 프로그래밍할 수 있다면, MATLAB는 매우 강력하다.

3.2 단점

  • 더럽게 무겁다. 무지막지한 명령어 세트를 가지고 있는 인터프리터 언어이기 때문이다. 따라서 아무리 효율적으로 짜도 C는커녕 가상머신 위에서 돌아가는 Java보다 느리다. 많은 기능의 수를 감안하더라도 빠른 편은 아니다.
  • 명령어 세트가 그냥 무식하게 때려박힌 구조라 필요한 헤더만 선언하여 최적화를 할 수가 없다. 매트랩이 본격적인 언어로 쓰이지 않는 이유 중 하나이다.
  • 모든 연산이 벡터로 처리되므로 코드가 너무 쉽게 스파게티 코드가 된다.
  • 2012a 버전부터는 좀 많이 덜하지만, 그 이전 버전은 윈도우 유저 입장에서는 악성코드라고 불릴 정도로 느리고 짜증 났다. 한번 설치하면 삭제가 제대로 안 될 정도였으니(...). 그에 반해 OS X리눅스에서는 비교적 잘 돌아갔다. 유닉스 버전과 윈도우 버전으로 배포되는데, 이 유닉스 버전이 리눅스와 OS X를 지원한다. 그리고 이쪽이 더 빠르다.
  • 라이선스 비용이 지나치게 비싸다. 보통 학생용은 기능을 제한하는 대신 싸게 파는 게 보통인데, 매트랩은 한화로 15만 원씩 한다. 그런데 미국에서는 학생에게는 50불, 툴박스는 무조건 10불에 판매한다. 상업 버전이 툴박스 하나에 1,000불인 것이 함정. 2016년 4월 현재 학생용은 MATLAB and Simulink Student Suite가 $55이고 애드온은 $5에 판매하고 있다. 당장 사야해만약 라이센스를 살 예산이 없다면 MATLAB을 대체할 프로그램이 몇 개 있긴 하다. 그 중 대표적인게 GNU octave. 문법을 익히는 덴 부족함이 없지만 decent한 툴박스나 성능은 그리 기대하지 말자.
  • 간단한 행렬 연산을 for, if, while 문으로 써서 만든다면, 무지막지하게 시간이 걸린다. 그래서 매트랩 입문자들에게는 튜토리얼 때 가능한 한 벡터화(vectorization)라는 테크닉을 사용하도록 가르친다. 이름은 거창해 보이지만, 단순히 for, if, while 대신 매트랩에서 자체 지원하는 함수들을 사용한다고 생각하면 편하다. for이나 while 루프는 그 구조상 순차적(sequential)으로 처리할 수밖에 없지만, 매트랩의 행렬 관련 operation들은 병렬(parallel) 연산을 지원하기 때문. 효율이 몇십~몇백 배 이상 증가한다. 하지만 2015b 버전 이후로는 엔진 최적화에 신경을 쓰었는지 루프를 사용한 행렬 연산의 속도가 많이 개선된 편이다. 이는 스크립트를 실행하는 과정에서 Just-In-Time 컴파일을 도입하였기 때문인데, 그럼에도 불구하고 루프 구문의 실행은 다른 프로그래밍 언어에 비해 상당히 느린 편이다 [3]

4 기타

비슷한 프로그램으로 매스매티카메이플, 그리고 SciLab이 있다. 엑셀을 빼먹네 매트랩과 매스매티카는 각각 차이가 있는데, 매트랩은 내부 알고리즘이 주로 수치로 돌아가기 때문에 계산도 느린 주제에 정확성도 떨어지고, 매스매티카는 다항식을 그대로 쓰므로 정확성은 매우 높다. 단지 매스매티카가 지원하지 않는 기능들을 매트랩이 지원하는 경우가 많기에 공대생은 주로 매트랩을 쓰는 편이다. 이산수학을 연구하는 수학자들은 매스매티카를 주로 사용한다. 물론 매스매티카가 다중 적분식으로 가면 느려지긴 하는데, 그건 매트랩이 정확도를 크게 요구하지 않다 보니 항을 100분할 정도 해서 그냥 사다리꼴 등으로 계산해버리는 편법을 써서 그렇다. 그런 식으로 정확도를 희생해서 속도를 높일 수 있는 경우가 아닌 일반적인 계산은 매트랩이 매스매티카보다 느리다.

MATLAB 계산 엔진도 나날이 발전하는 중이어서, 코드만 효율적으로 짠다면 아주 답답하지 않을 정도로는 최적화할 수 있다. 어떻게 코드를 효율적으로 바꿀 수 있는지도 가이드하는 기능도 있다.
  1. 프로그래밍 기능이 있는 공학용 계산기를 떠올리면 비슷하다
  2. 사족으로 바이오의공학부에서는 MATLAB이 필수다.
  3. 이 속도 문제를 해결하기 위해서는 크게 세 가지 방법이 있다. 하나는 Vectorization을 통해 코드를 최적화 하거나, 해당 부분을 mex 로 구현하거나, parallel toolbox를 활용하는 것이다. 하지만 벡터라이제이션은 행렬연산에 익숙지 않은 사람에겐 가독성이 떨어질 우려가 있으며 mex를 구현하기 위해선 C언어나 포트란을 알아야 하며 parallel toolbox는 별도의 라이센스 비용을 지불하고 구입해야 하고, 기능도 다른 프로그래밍 언어에서의 multithread processing에 비해 다소 제한적이다.