1. 程式人生 > >Matlab C混合程式設計

Matlab C混合程式設計

  1.     // 獲取維度個數
  2.     numOfDim = mxGetNumberOfDimensions(pArray);  
  3.     // 獲取維度陣列
  4.     Dims = mxGetDimensions(pArray);

需要注意的是,在Matlab裡,矩陣第一行是從1開始的,而在C語言中,第一行的序數為零,Matlab裡的矩陣元素b(i,j)在傳遞到C中的一維陣列data後對應於data[j*M+i] 。 輸入資料是在函式呼叫之前已經在Matlab裡申請了記憶體的,由於mex函式與Matlab共用同一個地址空間,因而在prhs[]裡傳遞指標就可以達到引數傳遞的目的。但是,輸出引數卻需要在mex函式內申請到記憶體空間,才能將指標放在plhs[]中傳遞出去。由於返回指標型別必須是mxArray,所以Matlab專門提供了一個函式:mxCreateDoubleMatrix來實現記憶體的申請,函式原型如下: 
   mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag) 
   m:待申請矩陣的行數 
   n:待申請矩陣的列數 
為矩陣申請記憶體後,得到的是mxArray型別的指標,就可以放在plhs[]裡傳遞回去了。但是對這個新矩陣的處理,卻要在函式內完成,這時就需要用到前面介紹的mxGetPr。使用 mxGetPr獲得指向這個矩陣中資料區的指標(double型別)後,就可以對這個矩陣進行各種操作和運算了。下面的程式是在上面的show.c的基礎上稍作改變得到的,功能是將輸出處理後的元素:
//reverse.c 1.0 
#include "mex.h" 
void mexFunction(int nlhs, mxArray *plhs[], 
    int nrhs, const mxArray *prhs[]) 
{ 
double *inData; 
double *outData; 
int M,N; 
int i,j; 
inData=mxGetPr(prhs[0]); 
M=mxGetM(prhs[0]); 
N=mxGetN(prhs[0]); 
plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL); 
outData=mxGetPr(plhs[0]); 
for(i=0;i<M;i++) 
  for(j=0;j<N;j++) 
   outData[j*M+i]=inData[(N-1-j)*M+i]; 
} 


當然,Matlab裡使用到的並不是只有double型別這一種矩陣,還有字串型別、稀疏矩陣、結構型別矩陣等等,並提供了相應的處理函式。本文用到編制mex程式中最經常遇到的一些函式,其餘的詳細情況清參考Apiref.pdf。