混合程式設計環境是matlabr2018b,vs2017,matalb的版本應該比c的版本要高,否則matalb無法識別c編譯器,並且vs2010不支援某些函式(isinf)
最近一直在做harq系統的搭建和ldpc有關編碼解碼部分的實現,對於i5cpu的膝上型電腦,matlab在1500碼長時,一次解碼的時間大概在0.1-0.2s,隨著碼長的增長而類似指數上公升,對於資料集的漸進生成和大容量的資料傳輸很不友好。應導師的要求,決定將matlab中ldpc的解碼部分使用c語言來編寫,並使用混合程式設計在mex中進行呼叫,此部落格是對之前工作的一些總結,防止以後忘記
首先是關於基礎部分,對於市面上的任何一本c語言參考書,需要看主要是函式,陣列,指標三大塊內容,對於沒有接觸過c語言的同學,大概1天能達到看明白該程式的水平,對於以前接觸過c語言的同學,半天到兩個小時就夠了
然後搜尋一些關於malloc函式的規範和申請記憶體空間的部分,這裡就不再贅述,值得注意的是,在定義陣列的時候,不能像matlab一樣對使用變數進行定義如
void fun(int a)
這樣的程式不被允許,只能在函式的開頭
double m;
m=(double)malloc(sizeof(double)n);
方式來申請記憶體空間,其中,前方要進行強制的型別轉化(網上有的人說void可以強制轉化成任意的型別),sizeof(double)是為了得到乙個double資料的位元組數,n是陣列中的元素的個數,m是該陣列的首位址,因為c儲存資料的特殊性,所以然後在之後的使用中可以寫m[i]來表示其中的第i+1個元素
現在進入程式部分(對於二維陣列(要時刻提醒自己a[2][3],a+1是第二行的首位址,c語言指標中不存在matalb的行列的概念),改動地方有以下幾處:
1.在decode函式中將ycap[n]的宣告方式改為了上述的宣告方式,否則在matlab的mex編譯時,會出現「不能以變數宣告陣列」
2.將decode函式中最後乙個迴圈的範圍由k改為了n,這是因為源程式的編碼部分是直接將校驗位放在資訊位後的,而在自己的編碼程式中,其中的元素經過了換位,要在之後使用ex_msg和reorder才能把資訊位給復原出來
3.在生成plhs[0] = mxcreatedoublematrix的部分,同樣將k改為了n,目的是使得程式輸出n個位元的判決結果,而不是k個位元的資訊位
首先談論一下源程式,調製方式是bpsk,2r-1(1->1,0->-1),輸入引數的llr資訊是2r/sigma,即ln(p(1)/p(0)),在函式內會有乙個負號的轉換,這裡值得注意
[u_out, checkok] = mexfastdecoder(k,n,ncw,sigmaw2,a,b,h,2r/sigmaw2,iterations);
其中k是資訊位長度,n是總碼長,a,b分別表示列行的1的數目和位置,h是校驗矩陣,2r/sigmaw2是似然度資訊,iterations是最大迭代次數
void mexfunction(int nlhs, mxarray *plhs, int nrhs, const mxarray *prhs)
prhs代指輸入函式的指標
plhs代指輸出函式的指標,並且可以用left,right來記憶
首先來討論幾個函式
mxgetscalar(prhs[0]):把通過prhs[0]傳遞進來的mxarray型別的指標指向的資料(標量)賦給c程式裡的變數;
a = mxgetpr(prhs[4]): 是乙個指標,指向輸入矩陣的第乙個元素
plhs[0] = mxcreatedoublematrix(1, ncw*n, mxreal); 申請一段double矩陣的記憶體,並使用plhs[0]來存放
u_out = mxgetpr(plhs[0]); u_out是乙個指標,指向plhs[0]記憶體空間的首位置,要注意這些檔案中大部分使用的都是指標,以此來保證在子函式中對值的改變會改變傳入引數的值
具體的請見cpp檔案
Matlab C 混合程式設計之Hell world
matlab與c 混合程式設計,c 中的函式跟matlab中的函式一樣,都可以使用,hello.cpp中的c 為 include mex.h void mexfunction int nlhs,mxarray plhs,int nrhs,const mxarray prhs 其中 include m...
Matlab C混合程式設計(Matlab呼叫C)
類似matlab的指令碼語言的最大詬病就是執行速度慢,而c的編寫難度大,但執行速度快,所以用matlab呼叫c可以很好的互補。用matlab呼叫c語言如下,其中mexfunction是乙個介面函式,用來溝通matlab與c語言之間的程式設計代溝。nlhs 輸出引數數目 left hand side ...
Matlab C 混合程式設計中見過的函式
記錄一下matlab c 混合程式設計中見到或用過的函式 double mxgetpr const mxarray array ptr 獲取mxarray中的實數資料,返回資料的起始指標const mwsize mxgetdimensions const mxarray pm 得到乙個指向維度陣列的...