C++.mat 파일 을 읽 고 쓰 는 방법
제 컴퓨터 환경 은 win 7 64 비트 시스템,VS 2010,matlab R2010b 입 니 다.
1.프로젝트 설정: 1.VC++디 렉 터 리->디 렉 터 리 추가 포함: MATLAB\R2010b\extern\include MATLAB\R2010b\extern\include\win64 ->라 이브 러 리 추가: MATLAB\R2010b\extern\lib\win64\microsoft MATLAB\R2010b\extern\lib\win32\microsoft 2.C/C++->일반->추가 포함 디 렉 터 리 추가: MATLAB\R2010b\extern\include MATLAB\R2010b\extern\include\win64 3.링크 기->입력->추가 의존 라 이브 러 리 추가: libmat.lib libmx.lib libmex.lib libeng.lib
설 치 된 matlab 가 64 비트 이기 때문에 함 수 를 호출 하려 면 프로젝트 를 X64 로 변환 해 야 합 니 다. 4.상단 메뉴->생 성->설정 관리자->플랫폼:X64 5.링크 기->고급->대상 컴퓨터: MachineX64(/MACHINE:X64)
6.컴퓨터 환경 변수->path 추가: E:\DevTools\MATLAB\R2010b\extern\lib\win64\microsoft; E:\DevTools\MATLAB\R2010b\bin\win64;
2.사용 하 는 기본 읽 기 쓰기 mat 파일 코드 예제:
우선 헤더 파일 을 포함해 야 합 니 다:
#include <mat.h>
[cpp] view plaincopy
MATFile *pmatFile = NULL;
mxArray *pMxArray = NULL;
// .mat ( :mat "initUrban.mat", "initA")
double *initA;
pmatFile = matOpen("initUrban.mat","r");
pMxArray = matGetVariable(pmatFile, "initA");
initA = (double*) mxGetData(pMxArray);
M = mxGetM(pMxArray);
N = mxGetN(pMxArray);
Matrix<double> A(M,N);
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
A[i][j] = initA[M*j+i];
matClose(pmatFile);
mxFree(initA);
// .mat
double *outA = new double[M*N];
for (int i=0; i<M; i++)
for (int j=0; j<N; j++)
outA[M*j+i] = A[i][j];
pmatFile = matOpen("A.mat","w");
mxSetData(pMxArray, outA);
matPutVariable(pmatFile, "A", pMxArray);
matClose(pmatFile);
3.절차 설명 1.matOpen 함수 로 mat 파일 열기
MATFile *matOpen(const char *filename,const char *mode)
mode: r:읽 기 전용 으로 열기 u:업데이트 모드,읽 고 쓸 수 있 지만 열 데이터 파일 이 존재 하지 않 으 면 새 파일 을 만 들 지 않 습 니 다. w:기록 방식 으로 열 면 입력 과 같이 쓸 수 있 습 니 다.열 데이터 파일 이 존재 하지 않 으 면 새 파일 을 만 듭 니 다.
2.matGetVariable 함 수 를 사용 하여 mat 파일 의 변 수 를 읽 습 니 다.
mxArray * matGetVariable(MATFile * pMF, const char * name);
이름 이 name 인 변 수 를 읽 고 데이터 배열 지침 을 되 돌려 줍 니 다.
3.mxGetData 함 수 를 사용 하여 데이터 배열 의 데 이 터 를 가 져 옵 니 다.
void *mxGetData(const mxArray *pa );
돌아 올 때 강제 형식 변환 을 사용 해 야 합 니 다.
4.mxGetM 과 mxGetN 함 수 를 사용 하여 데이터 배열 행렬 의 위 치 를 가 져 옵 니 다.
size_t mxGetM(const mxArray *pa);
size_t mxGetN(const mxArray *pa);
5.mxSetData 함 수 를 사용 하여 변 수 를 데이터 배열 에 저장 합 니 다.
void mxSetData( mxArray *pa, void *newdata );
6.matPutVariable 함 수 를 사용 하여 데이터 배열 을 mat 파일 에 저장 합 니 다.
int matPutVariable(MATFile * pMF, const char * name, const mxArray * pA);
저장 성공 반환 0,저장 오류 반환 0 이 아 닙 니 다.
7.malab 에서 행렬 의 저장 소 는 열 에 따라 저장 되 기 때문에 c 와 다 르 기 때문에 mat 파일 에서 얻 은 행렬 은 다시 배열 해 야 합 니 다.mat 파일 을 만 들 때 도 마찬가지 로 주의해 야 합 니 다.