【问题标题】:How to run .exe programs passing variables from Matlab workspace?如何运行从 Matlab 工作区传递变量的 .exe 程序?
【发布时间】:2012-06-19 15:33:20
【问题描述】:

我正在处理一个需要大量数据处理的 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 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 程序在不打开 .txt 或 .dat 文件的情况下从 matlab 工作区读取变量?

提前感谢您阅读我的主题的好意。

【问题讨论】:

    标签: matlab variables exe workspace mex


    【解决方案1】:

    命令!test.exe a b 试图在字符串'a''b' 上运行test.exe,而不是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 Compiler 从 MATLAB 创建的吗?如果是这样,以上仍然可能无法实现您想要的。使用 MATLAB Compiler 创建的可执行文件的运行速度与实时 MATLAB 相同。

    【讨论】:

    • .. 加上在 MCR 下运行编译的 .exe 的开销(初始化很慢)
    • 感谢您的回答。你真的帮助了我。那么运行我的程序的最快方法是什么?使用并行工具箱并行化我的 m 文件或用 c 代码在 matlab 之外编写程序?如果我们从 matlab 运行所有内容,MEX 比 .exe 快吗?
    • 这完全取决于您希望加速的特定代码。在没有更多了解的情况下,我将首先专注于优化 MATLAB 代码,使用诸如预分配和分析器之类的技术。然后,如果您的部分代码易于并行化,则使用 Parallel Computing Toolbox 可以提供一些非常容易的速度提升。最后,您可以获取分析器识别的瓶颈点并重新编码到 C mex 文件中。
    猜你喜欢
    • 2015-10-21
    • 2020-10-10
    • 2011-02-15
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多