Linux下C和matlab混合程式設計學習(1)

zhuiqiuk發表於2017-07-25
1.編譯m檔案為可執行檔案
mex -setup設定好了c編譯器之後。
寫個簡單函式test.m
function test
x=0:0.01:2*pi;
y=sin(x);
plot(x,y)
儲存.
編譯mcc -m test.m
就會生成可執行的檔案test和一個指令碼run_test.h
./run_test.h<matlab_root>/bin

2.C中呼叫matlab計算引擎(繪圖等)
步驟:
(1)安裝csh;
(2)設定:動態庫路徑LD_LIBRARY_PATH中新增<matlab_root>/bin/<Arch>; 
       PATH路徑中新增<matlab_root>/bin
(3)編譯:gcc test.c -o test -I $HOME/MATLAB/R2011b/extern/include-L $HOME/MATLAB/R2011b/bin/glnx86/ -leng -lmx -lmex
 (注意cpu是x86還是a64)
(4)執行:./test

其中第(2)步設定,在~/.bashrc中新增:
MATLAB="Matlab_Installed_Directory"(比如說我的安在了$HOME/MATLAB/R2011b下面,所以應該寫全到2011b)
export PATH=~/Program:$MATLAB/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnx86#這裡注意cpu是x86還是a64
exportC_INCLUDE_PATH=$C_INCLUDE_PAT:$MATLAB/extern/include
export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnx86
(前面兩行是一個是可執行檔案搜尋路徑,一個是動態庫搜尋路徑,後面兩個是gcc編譯時的include標頭檔案搜尋路徑和動態庫搜尋路徑)
這樣第三步編譯就可以簡單的寫為:
gcc test.c -o test -leng -lmx -lmex


原始檔test.c如下:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "engine.h"

#define N 500

main()
{
int i;
double x[N],y[N];
Engine *ep;

for(i=0;i<N;i++){
x[i]=0.01*i;
y[i]=sin(x[i]);
}

//啟動matlab計算引擎,異常處理
if(!(ep=engOpen(NULL))){
printf("Can't start Matlab engine!");
exit(1);
}

//定義mxArray
mxArray *xx=mxCreateDoubleMatrix(1,N,mxREAL);
mxArray *yy=mxCreateDoubleMatrix(1,N,mxREAL);

//將陣列複製到mxArray
memcpy(mxGetPr(xx),x,N*sizeof(double));
memcpy(mxGetPr(yy),y,N*sizeof(double));

//將mxArray陣列寫入到Matlab工作空間,並命名
engPutVariable(ep,"xx",xx);
engPutVariable(ep,"yy",yy);

//向Matlab引擎傳送畫圖命令
engEvalString(ep,"plot(xx,yy);");

printf("Press 'Enter' to exit!");
getchar();

//銷燬mxArray陣列
mxDestroyArray(xx);
mxDestroyArray(yy);

//關閉matlab引擎
engClose(ep);

}

有圖為證:
Linux下C和matlab混合程式設計學習(1)

相關文章