1

我正在研究一个需要大量数据处理的 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)

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

我知道我可以将变量传递给 .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 程序在不打开 .txt 或 .dat 文件的情况下从 matlab 工作区读取变量?

预先感谢您阅读我的主题的好意。

4

1 回答 1

1

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

如果您执行以下操作:

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

那会以我认为您打算的方式调用它。

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

于 2012-06-19T16:22:24.967 回答