C에서 MATLAB 호출하기

본 내용에 대한 더 자세한 내용은 MathWorks 홈페이지를 참고하시기 바랍니다.

C의 개발환경과 MATLAB 엔진

MATLAB에서 알고리즘 개발이 용이한 이유는 자료의 시각화 기능이 편리하고, low level 알고리즘을 구현하지 않아도 여러 툴박스에서 구현된 기능들을 가져다 쓸 수 있기 때문이다.

그러나 많은 경우 C/C++ 같은 low level 언어를 이용한 개발을 피할 수 없는 경우가 많다. 가끔씩 데이터를 시각화 하고 싶을 때 ‘MATLAB을 쓸 수 있다면 참 좋을텐데…’ 하는 생각이 들 때가 종종 있다. 가령, cosine 함수를 계산해놓고 ‘그려서 볼 수 있다면 편하지 않을까?’ 하는 것이다. 물론 C/C++ 에서 txt 파일로 변수값을 출력하고 다시 MATLAB에서 이것을 읽어들여 plot 해볼 수도 있지만 C/C++에서 직접 MATLAB의 내장 함수를 불러와 바로 사용할 수 있다면 업무 효율을 더 높일 수 있을 것이다.

이번 포스팅에서는 Windows 환경에서 가장 널리 쓰이는 C/C++ IDE 중 하나인 Visual Studio를 이용해 C/C++ 코드에서 MATLAB 엔진을 구동해 C/C++에서 계산된 변수를 plot 해보고자 한다.

Windows Visual Studio의 설정

Visual Studio에서 MATLAB을 열기 위해선 여러가지 설정이 수행되어야 한다.

Visual Studio 설정과 관련된 내용은 StackOverflow Question 중 하나인 Calling MATLAB Engine error: libeng.dll is missing from your computer에서 찾은 것임을 밝힌다.

(1) 우선 MATLAB을 COM Server로 등록해야 한다. 만약 여러개 MATLAB을 가지고 있다면 C/C++에서 부르고자 하는 MATLAB 버전과 동일한 버전의 MATLAB을 등록해야 한다. MATLAB을 관리자 권한으로 열고 아래와 같이 Command Window에 타이핑하자.

!matlab -regserver

이 때, MATLAB Command Window 창이 하나 뜨게 되는데 이 창은 닫아주자. 더 자세한 사항은 아래의 MathWorks 홈페이지를 참고해보자.

(2) Visual Studio에서 Debugger를 실행시킬 때 참고할 경로를 설정해주자. 내 컴퓨터를 우클릭하여 “설정”을 누르면 시스템 설정 창이 뜨게 된다. 여기서 “고급 시스템 설정”에 들어가서 “환경 변수 > 시스템 변수”로 들어가 “Path”를 수정(Edit)해주자. 아래와 같은 경로를 추가하자.

“C:\Program Files\MATLAB\R2021b\bin\win64”

(현재는 R2021b 버전을 기준으로 작성하였지만 사용하는 버전에 맞춰 작성하면 됨)

만약, Visual Studio를 켜둔 상태에서 이 과정이 수행되었다면 반드시 Visual Studio를 재시작하자.

(3) Visual Studio를 켜고 C/C++을 위한 project를 생성하자. 그리고 project의 Property를 열어보자.


그림 1. Project의 Property

(4) 64-bit MATLAB을 구동한다면 “Configuration Manager”를 열고 active solution platform이 “x64”로 설정되어 있는지 확인하자.


그림 2. 64 bit 매트랩을 사용한다면 꼭 64비트 platform에서 C코드가 동작할 수 있도록 확인하자

(5) VC++ Directiries > Library Directories에 아래와 같은 path를 입력해주자.

C:\Program Files\MATLAB\R2021b\bin\win64


그림 3. Library directory path

(6) C/C++ IDE에서 MATLAB을 호출하기 위해선 “engine.h”를 불러와야 한다. 이 header 파일은 아래의 경로에서 찾을 수 있다.

C:\Program Files\MATLAB\R2021b\extern\include

이 경로를 C/C++ > General > Additional Include Directories에 넣어주자.


그림 4. "engine.h" Header 파일의 경로 추가

(7) MATLAB engine 사용 시에 사용되는 Linker 파일들은 “libeng.lib”와 “libmx.lib” 인데 이 파일들은 아래의 경로에서 찾을 수 있다.

C:\Program Files\MATLAB\R2021b\extern\lib\win64\microsoft

이 경로를 Linker > General > Additional Library Directories에 추가해주자.


그림 5. Linker 파일 경로 추가

(8) 또 앞서 언급한 *.lib 파일들을 아래와 같이 Linker > Input에 추가해주자.


그림 6. Linker 파일 경로 추가

예시

아래의 C/C++ 코드를 이용하면 cosine 함수를 C/C++에서 계산하고 MATLAB에서 plot 해줄 수 있다.


그림 7. C 코드를 이용해 MATLAB을 호출하여 cosine 함수를 plot하는 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define _USE_MATH_DEFINES
 
#include <iostream>
#include <math.h>
#include <conio.h>
#include <ctype.h>
#include "engine.h"
 
using namespace std;
 
int main() {
    Engine* ep = engOpen(NULL);
    double x[1000];
 
    int i;
    double t = 0;
    const double dt = 0.001;
 
    mxArray* x_array = mxCreateDoubleMatrix(10001, mxREAL);
    mxDouble* px = mxGetDoubles(x_array);
 
    for (i = 0; i < 1000; i++) {
        x[i] = cos(2 * M_PI * t); // To check numbers in C
        t += dt;
 
        px[i] = x[i];
    }
 
    engPutVariable(ep, "x", x_array);
    engEvalString(ep, "plot(x)");
   
    _getch(); // To make cmd stop until pressing any keys.
 
    engClose(ep);
 
    return 0;
}
 
cs