2012-11-23 62 views
1

我在編寫示例mex和犰狳程序時遇到困難,想知道是否有人可以幫助我。我正在使用Mac OS,並且在安裝過程中取得了成功。編譯Mex和Armadillo難度

代碼:

#include "mex.h" 
#include "math.h" 
#include<armadillo> 


using namespace arma; 

void matlab2arma(mat& A, const mxArray *mxdata){ 
// delete [] A.mem; // don't do this! 
access::rw(A.mem)=mxGetPr(mxdata); 
access::rw(A.n_rows)=mxGetM(mxdata); // transposed! 
access::rw(A.n_cols)=mxGetN(mxdata); 
access::rw(A.n_elem)=A.n_rows*A.n_cols; 
}; 

void freeVar(mat& A, const double *ptr){ 
access::rw(A.mem)=ptr; 
access::rw(A.n_rows)=1; // transposed! 
access::rw(A.n_cols)=1; 
access::rw(A.n_elem)=1; 
}; 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
if (nrhs != 2) 
mexErrMsgTxt("Incorrect number of input arguments"); 
if (nlhs != 1) 
mexErrMsgTxt("Incorrect number of output arguments"); 

mat D1(1,1); 
const double* D1mem=access::rw(D1.mem); 
matlab2arma(D1,prhs[0]); // First create the matrix, then change it to point to the matlab data. 

mat D2(1,1); 
const double* D2mem=access::rw(D2.mem); 
matlab2arma(D2,prhs[1]); 

// check if the input corresponds to what you are expecting 
if(D1.n_rows != D2.n_rows) 
mexErrMsgTxt("Columns of D1 and D2 must be of equal length!"); 

if(D1.n_cols != D2.n_cols) 
mexErrMsgTxt("Rows of D1 and D2 must be of equal length!"); 

plhs[0] = mxCreateDoubleMatrix(D1.n_rows, D1.n_cols, mxREAL); 
mat output(1,1); 
const double* outputmem=access::rw(output.mem); 
matlab2arma(output,plhs[0]); 

output=D1+D2; 
// output.print(); 

freeVar(D1,D1mem); // Change back the pointers!! 
freeVar(D2,D2mem); 
freeVar(output,outputmem); 
return; 
} 
+1

什麼是編譯器錯誤你? – Isaac

+0

mex -I/Library/armadillo-3.4.4/include/-lblas -llapack example1.cpp example1.cpp:在函數'void matlab2arma(arma :: mat&,const mxArray *)'中: example1.cpp:9 :error:'access'尚未聲明 example1.cpp:9:error:'rw'未在此範圍內聲明 example1.cpp:10:錯誤:'access'尚未聲明 example1.cpp:11 :錯誤:'訪問'尚未聲明 example1.cpp:12:錯誤:'訪問'尚未聲明 example1.cpp:函數'void freeVar(arma :: mat&,const double *)': ???在208處使用==> mex時出錯012 無法成功完成 –

+0

「access」命名空間應該來自哪裏? – Isaac

回答

1

它確實在我的系統工作(Ubuntu的12.04,64位,MatlabR2013a,克++)使用以下編譯命令:

mex mexTest.cpp -llapack -larmadillo -lblas 

其中mexTest.cpp包含您提供的代碼片段。請注意,爲了在Matlab下正確編譯Armadillo,需要正確設置庫路徑。這些可以在mexopts.sh中更新,也可以通過重定向$ matlabroot/sys/os/XXXXX中的符號鏈接進行更新,其中XXXXX可能因系統而異(32/64位&OS)。

0

如果你有犰狳設置正確,只是做以下就足夠了(代碼也成功地爲我工作):

mex your_code.cpp -larmadillo