如何运行.exe程序从Matlab工作区传递变量?

时间:2012-06-19 15:33:21

标签: matlab variables exe workspace mex

我正在开发一个需要大量数据处理的Matlab项目,并且代码的某些部分需要比Matlab函数运行得更快。为此,我需要在其他脚本中调用.exe来传递工作空间中的变量。为了理解如何解决这个创建一个小的附加程序。

我有以下代码

function test(a,b)
if ischar(a)
  a2=str2num(a);
else
  a2=a;
end
if ischar(b)
  b2=str2num(b);
else
  b2=b;
end
res=a2+b2;
disp(res)

我使用部署工具使其可执行。 如果我通过matlab运行test.exe与!test.exe 5 3它的工作原理, 如果我创建两个变量a = 5和b = 3并尝试!test.exe a b它不起作用。

我知道我可以将变量传递给.txt或.dat文件,然后关闭并重新打开 再次通过程序(我需要使用的变量是动态的)但我不相信它比从工作区运行mfile加载变量更有效。

我还搜索过使用varargin,nargin等但是这些命令没有使用c的argc [],argv []。这样可以解决我的问题。

然后我搜索mex文件并编写以下代码:

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
   mxArray *mexGetVariable(const char *workspace, const char *varname);

   const mxArray *mex_a;
   const mxArray *mex_b;

   //http://www.mathworks.com/help/techdoc/apiref/mexgetvariable.html
   if ((mex_a = mexGetVariable("a", "global"))==NULL)
   {
        mexErrMsgTxt("Variable 'a' not in workspace.");
   }
   else if ((mex_b = mexGetVariable("b", "global"))==NULL)
   {
        mexErrMsgTxt("Variable 'b' not in workspace.");
   }
   else
   {
        mexEvalString("!test.exe mex_a mex_b"); 
   }
} 

(我也传递了变量a = 5 b = 3)但没有任何效果,因为我有一个提示说 变量a不在工作区中。

任何人都可以为我提供代码解决方案,如何让.exe程序从matlab工作区读取变量而无需打开.txt或.dat文件?

提前感谢您在阅读我的主题时的善意。

1 个答案:

答案 0 :(得分:1)

命令!test.exe a b正在尝试对字符串test.exe'a'运行'b',而不是ab的值。无论是从命令行还是通过mex文件运行它都会出现这种情况。

如果您执行以下操作:

>> a=5; b=3;
>> cmdstr = sprintf('!test.exe %f %f',a,b)
cmdstr =
!test.exe 5.000000 3.000000
>> eval(cmdstr)

这会以我认为你想要的方式来称呼它。

你的MATLAB编译器是用MATLAB创建的真正的.exe(不是test.exe)吗?如果是这样,上述情况仍可能无法实现您的目标。使用MATLAB Compiler创建的可执行文件以与实时MATLAB相同的速度运行。