관리 메뉴

Humaneer.net

MAT파일을 C/C++에서 읽기 본문

Matlab & Simulink

MAT파일을 C/C++에서 읽기

Humaneer 2009.11.06 11:11

MAT File이란?


MAT File은 .mat의 확장자를 가진 파일형식으로 매트랩에서 사용하는 데이터(or 변수)를 바이너리화한 파일이다. 예를 들면  int a = 10, b = 5; float c = 0.5f; 3개의 변수가 메모리에 올라가 있을 때, 이 것을 바이너리 파일로 저장한 것이 .mat파일이고 .mat파일에 접근하면 a, b, c의 데이터를 그대로 써먹을 수가 있는 것이다. 변수명 역시 그대로 써먹을 수가 있다. 그리고 .mat파일은 매트랩에서는 save라는 함수를 통해 간단하게 생성할 수가 있고, C/C++, JAVA, FORTRAN등 다른 프로그래밍 언어에서도 생성 및 접근이 가능하다. 구글링 or 매트랩 홈페이지를 가면 이놈이 무엇인지 더욱더 확실하게 definition을 얻을 수 있을 것이다.

C/C++ 에서 .mat파일 API 써먹기


예제로 사용할 C파일은 'matlab_root\R2008a\extern\examples\eng_mat' 디렉토리에 있는 matdgns.c 파일이다. 이 파일 말고도 C/C++에서 .mat파일을 사용하는 좋은 예제파일이 examples디렉토리에 많이 있다.+_+  소스 코드의 길이가 스크롤의 압박이므로 자세히 보려면 소스보기를 클릭하면 된다.

더보기



주석을 보면 알겠지만, .mat파일에 접근하기 위해 매트랩에서 제공하는 C/C++용 API 함수를 호출함을 알 수 있다. 이 예제에 있는 함수 말고도 몇가지가 더 있는데 매트랩 홈페이지나 구글링을 하면 간단하게 찾을 수 있다.

VS 2005에서 빌드하기


요놈을 컴파일하고 링크하기 위해서는 몇가지 절차가 필요하다.
일단 몇가지 헤더파일을 include하기 위해 'matlab_root\extern\include' 디렉토리를 include 디렉토리에 추가한다. 물론 요놈은 어떤 IDE를 사용하는가에 따라 다르다. 참고로 vs2005에서는 아래와 같이 하면 된다.


그리고 라이브러리를 링크해주어야 한다. 라이브러리 디렉토리를 먼저 추가하게 되는데, 자신이 어떤 컴파일러를 사용하는가에 따라 달라진다. 기본적으로 매트랩에서는 LCC, WATCOM 그리고 MS의 C컴파일러를 위한 라이브러리를 제공하는데 나는 MS의 VS2005를 사용하므로 'matlab_root\extern\lib\win32\microsoft' 로 디렉토리를 정해주었다. VS2005에서는 아래와 같이 하면 된다.



마지막으로 라이브러리 파일을 설정해주어야 한다. libmx.lib, libmat.lib, libeng.lib 이 3개의 파일을 설정하여야 하는데 MS계열의 컴파일러는 #pragma commet(lib, "~~~~~~") 이라는 전처리명령을 통해 코드상에서 설정해줄 수도 있고, 프로젝트 속성에 가서 추가할 수도 있다. 아래는 프로젝트 속성에서 추가를 한 것.


아니면

#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "libeng.lib")

위의 코드를 추가하여야 한다.

이렇게 세팅해주면 컴파일과 링크가 모두 잘 되고 실행파일이 생성된다. 나머지 예제파일들도 위의 과정을 거치면 빌드가 잘 될 것이다. 물론 다 해보지는 않음 -_-; 그리고 예제파일을 보면서 매트랩에서 제공하는 .mat파일 관련 API 함수의 사용법을 익히면 될 것이다. ㅋ

조만간에 matlab에서 생성한 함수 .m파일을 dll로 변환하여 C/C++에서 사용하는 팁도 올릴예정.


5 Comments
  • 프로필사진 장모 2009.11.14 00:18 신고 핸드폰 번호이동으로 새로 구매했습니다.
    ㅎㅎ
  • 프로필사진 Favicon of http://vense.tistory.com BlogIcon 밴스 2010.10.03 10:32 신고 게시글 잘 보았습니다.
    혹시 컴파일과정에서 dll에 대한 오류에 부딪히시지 않았나요? 뭐 dll 찾아서 붙여넣어주면 되긴 하지만, 근본적인 해결책은 아닌것 같습니다.
    혹시 저와같은 문제에 부딪히지시 않으셨나 궁금해서 이렇게 여쭙습니다. 감사합니다.
  • 프로필사진 Favicon of http://humaneer.net BlogIcon Humaneer 2010.10.20 08:34 신고 음.거의 1년 전에 한 것이라 잘 기억은 안납니다만.

    컴파일 과정에서 DLL 오류는 없었던 것으로 기억합니다.

    혹시 오류라는 것이 링킹과정에서 생기는 라이브러리 문제인지요? 라이브러리 디렉토리를 지정하시면 될 것 같습니다.
  • 프로필사진 아야세 아리사 2015.01.26 17:17 신고 글에 적으신대로 다 따라가서 해봤습니다.

    근데 10개의 오류가 나오더군요

    error LNK2019: unresolved external symbol _matGetNextVariable referenced in function "int_cdecl diagnose(char const*)"(?diagnose@@YAHPBDZ@)
    error LNK2019: unresolved external symbol _matDestroyArray referenced in function "int_cdecl diagnose(char const*)"(?diagnose@@YAHPBD@Z)
    .
    (중략)
    .
    fatal error LNK1120: 9 unresolved externals

    http://postfiles11.naver.net/20150126_186/shlee0920_1422260062371a0GpN_PNG/%BF%A1%B7%AF%B8%AE%BD%BA%C6%AE.png?type=w2
  • 프로필사진 Favicon of http://humaneer.net BlogIcon Humaneer 2015.01.28 19:22 신고 라이브러리 링크과정에서 발생하는 오류네요.
    1. 라이브러리 경로 지정이 안되었거나, 라이브러리 명이 잘못되었을 확률이 높습니다.

    2. 제가 이 블로그를 포스팅할시 매트랩 2009a 였는데 지금은 매트랩이 2014까지 나왔지요. 그 동안 라이브러리에 변경이 있어서 그럴수도 있습니다. 다른 최신 게시물을 참고해보시거나 Mathworks 홈페이지에서 공식 문서를 참고해보세요.
댓글쓰기 폼