我开始用C++实现一些m文件,以减少运行时间.m文件产生n维点并在这些点评估函数值.这些函数是用户定义的,它们作为函数句柄传递给m文件和mex文件.mex文件使用mexCallMATLAB和feval来查找函数值.
我构造了下面的例子,其中在Matlab命令行中构造的函数句柄fn被传递给matlabcallingmatlab.m和mexcallingmatlab.cpp例程.使用新开放的Matlab,mexcallingmatlab在241.5秒内评估此功能200000,而matlabcallingmatlab在0.81522秒内评估它,因此使用mex实现减慢296倍.这些时间是第二次运行的结果,因为第一次运行似乎更大可能是由于第一次加载程序等相关的一些开销.
我花了很多天在网上搜索这个问题并尝试了一些建议.我尝试了不同的mex编译标志来优化mex,但性能几乎没有差异.Stackoverflow上的一篇文章指出,升级Matlab是解决方案,但我在Mac OS X版本:10.8.4上使用的最新版本MATLAB版本:8.1.0.604(R2013a).我使用和不使用-largeArrayDims标志编译了mex文件,但这也没有任何区别.有人建议函数句柄的内容可以直接在cpp文件中编码,但这是不可能的,因为我想将此代码提供给具有矢量输入和实数输出的任何类型函数的任何用户.
据我所知,mex文件需要通过feval函数来使用函数句柄,而m文件可以直接调用函数句柄,前提是Matlab版本比某些版本更新.
任何帮助将不胜感激.
在Matlab命令行中创建的简单函数句柄:
fn = @(x) x'*x
Run Code Online (Sandbox Code Playgroud)
matlabcallingmatlab.m:
function matlabcallingmatlab( fn )
x = zeros(2,1);
for i = 0 : 199999
x(2) = i;
f = fn( x );
end
Run Code Online (Sandbox Code Playgroud)
mexcallingmatlab.cpp:
#include "mex.h"
#include <cstring>
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
mxArray *lhs[1], *rhs[2]; //parameters to be passed to feval
double f, *xptr, x[] = {0.0, 0.0}; // x: input to f and f=f(x)
int …Run Code Online (Sandbox Code Playgroud)