MATLAB是一個很好用的工具。利用MATLAB腳本進行科學計算也特別方便快捷。但是代碼存在較多循環(huán)時,MATLAB運行速度極慢。如果不想放棄MATLAB中大量方便使用的庫,又希望代碼能迅速快捷的運行,可以考慮將循環(huán)較多的功能采用C編寫,MATLAB調(diào)用。本文將概述這一過程。雖然本文以LDPC譯碼算法為例,但不懂該算法不影響本文閱讀。
1. 起因
最開始用MATLAB寫的LDPC譯碼算法中,其中一個版本是這里,里面有三重循環(huán),運行速度極慢。后來考慮了MATLAB的向量化操作,通過算法的合理劃分以及內(nèi)置函數(shù)調(diào)用,成功將三重循環(huán)修改為1層,具體這一版本的代碼可見這里。通過這一手段,函數(shù)的運行速度提高了幾倍乃至幾十倍。雖然這一方法下運行速度依舊比不過MATLAB工具箱中的comm.LDPCDecoder,遠比不上利用GPU的comm.gpu.LDPCDecoder,但勝在可明確算法并具有一定擴展性。
起初也注意到可以通過MATLAB調(diào)用C程序來加速程序運行,但向量化后的代碼湊活能用,加上有時也可調(diào)用更為強大的內(nèi)置函數(shù),這一想法一直沒有付諸實踐。這幾天想好好整理一下代碼,遂萌發(fā)了寫一個C版本譯碼算法的想法。代碼現(xiàn)在的狀態(tài)是“能用”,這里把相關經(jīng)驗總結分析在此。
2. MATLAB調(diào)用C程序
這一部分的內(nèi)容在劉曉輝的matlab調(diào)用C程序中已經(jīng)有較為詳細的介紹了,想要正確調(diào)用C程序,關鍵概括為2點。
機器上裝有MATLAB編譯器,可通過在MATLAB命令行窗口輸入mex -setup進行具體設置。
有一個正確的接口子程序mexFunction完成MATLAB和C程序之間的數(shù)據(jù)轉換和程序調(diào)用
這里給出我寫得mexFunction(注意這個代碼寫得不好,沒有任何判斷,沒有健壯性……)
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
double* llr = (double*)mxGetPr(prhs[0]);
int* rownum = mxGetPr(prhs[1]);
int* colnum = mxGetPr(prhs[2]);
int* trans = mxGetPr(prhs[3]);
double* state = mxGetPr(prhs[4]);
plhs[0] = mxCreateDoubleMatrix(1, state[1], mxREAL);
double* r =mxGetPr(plhs[0]);
ldpcDec( r ,llr, rownum,colnum, trans,state);
}
mexFunction的規(guī)范在劉曉輝的matlab調(diào)用C程序一文中已有提及,即
nlhs:輸出參數(shù)數(shù)目
plhs:指向輸出參數(shù)的指針
nrhs:輸入?yún)?shù)數(shù)目
prhs:指向輸入?yún)?shù)的指針
例如,在matlab命令行中使用
[a,b]=test(c,d,e)
調(diào)用mex函數(shù)test時,傳給test的這四個參數(shù)分別是
2,plhs,3,prhs
其中:
prhs[0]=c
prhs[1]=d
prhs[2]=e
由此可以解釋上述mexFunction,而命令plhs[0] = mxCreateDoubleMatrix(1, state[1], mxREAL) 則定義了一大小為1 × state[1]的矩陣,做為函數(shù)的返回值。最后調(diào)用的ldpcDec是一個C程序,運行C程序后plhs[0]指向的內(nèi)存空間存儲的就是滿足要求的計算結果。ldpcDec代碼如下
#include
#include
void ldpcDec(double*r,double* llr, int* rownum, int* colnum, int* trans, double* state){
//列有序,trans為映射關系
//rownum[i]-rownum[i-1],第i+1行的行重
//colnum[i]-colnum[i-1],第i+1列的列重
//state[0]:maxiter state[1]:llr & colnum 長度 state[2] rownum 長度,
//state[3]:H中非零元素個數(shù) state[4]: alpha
double* temp;
double* decodedtemp;
temp = (double*)malloc(sizeof(double)*state[3]);
decodedtemp = (double*)malloc(sizeof(double)*state[3]);
//init
int ii = 0;
for (int i = 0; i
-
matlab
+關注
關注
185文章
2974瀏覽量
230385 -
C程序
+關注
關注
4文章
254瀏覽量
36027
發(fā)布評論請先 登錄
相關推薦
評論