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