编译 Mex 和 Armadillo 的困难

Posted

技术标签:

【中文标题】编译 Mex 和 Armadillo 的困难【英文标题】:Difficulty in Compiling Mex and Armadillo 【发布时间】:2012-11-23 05:57:04 【问题描述】:

我在编译一个示例 mex 和犰狳程序时遇到了困难,想知道是否有人可以帮助我。我正在使用 Mac OS,并且安装成功。

代码:

#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;

【问题讨论】:

你得到什么编译器错误? mex -I/Library/armadillo-3.4.4/include/ -lblas -llapack example1.cpp example1.cpp: 在函数'void matlab2arma(arma::mat&, const mxArray*)'中: example1.cpp:9: 错误: 'access' 尚未声明 example1.cpp:9: 错误: 'rw' 未在此范围内声明 example1.cpp:10: 错误: 'access' 尚未声明 example1.cpp :11: 错误: 'access' 尚未声明 example1.cpp:12: 错误: 'access' 尚未声明 example1.cpp: In function 'void freeVar(arma::mat&, const double*)': ?? ?在 208 处使用 ==> mex 时出错无法成功完成 access 命名空间应该来自哪里? 这是个好问题!我一直试图弄清楚,但我不确定。我正在使用此链接中的示例:myoutsourcedbrain.com/2009/08/… 但我无法重现结果。你对我如何将墨西哥和犰狳结合有什么想法吗?谢谢 看起来access::rw 只是用来修改正常的赋值...如果你只是删除所有access::rws 并正常分配变量会发生什么?即access::rw(A.mem) = -> A.mem = 【参考方案1】:

使用以下编译命令,它在我的系统(Ubuntu 12.04、64 位、MatlabR2013a、g++)上运行:

mex mexTest.cpp -llapack -larmadillo -lblas

其中 mexTest.cpp 包含您提供的代码 sn-p。请注意,为了在 Matlab 下正确编译 Armadillo,需要正确设置库路径。这些可以在 mexopts.sh 中更新,或者通过重定向 $matlabroot/sys/os/XXXXX 中的符号链接,其中 XXXXX 可能会根据您的系统(32/64 位和操作系统)而有所不同。

【讨论】:

【参考方案2】:

如果您正确设置了犰狳,只需执行以下操作就足够了(代码对我来说也成功):

mex your_code.cpp -larmadillo

【讨论】:

以上是关于编译 Mex 和 Armadillo 的困难的主要内容,如果未能解决你的问题,请参考以下文章

犰狳 + Matlab Mex 段错误

Matlab + Armadillo 和逆矩阵崩溃

用于在 Windows 中的犰狳中构建 armaMex_demo.cpp 的 Matlab mex 命令

在编译/链接期间无法禁用 Armadillo Wrapper

XCode 4、Armadillo 和 XCode 标准库

使用 Armadillo 和 OpenBLAS 进行多线程处理时性能不一致