Как запускать программы .exe, передающие переменные из рабочей области Matlab?

Я работаю над проектом 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 через Matlab с !test.exe 5 3, он работает. Если я создаю две переменные a=5 и b=3 и пробую !test.exe a b, это не работает.

Я знаю, что могу передать переменные в файл .txt или .dat, а затем закрыть и снова открыть через программу (переменные, которые мне нужно использовать, являются динамическими), но я не считаю, что это более эффективно, чем запуск mfile загрузка переменных из рабочей области.

Я также искал об использовании varargin, nargin и т. Д., Но эти команды не используют argc [], argv [] C. Что-то вроде этого может решить мои проблемы.

Затем я ищу 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?

Заранее спасибо за вашу доброту в чтении моей темы.


person George    schedule 19.06.2012    source источник


Ответы (1)


Команда !test.exe a b пытается запустить test.exe для строк 'a' и 'b', а не для значений a и b. Это было бы так, запускали ли вы его из командной строки или через файл 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, работают с той же скоростью, что и живой MATLAB.

person Sam Roberts    schedule 19.06.2012
comment
.. плюс накладные расходы на запуск скомпилированного .exe под MCR (который медленно инициализируется) - person Amro; 19.06.2012
comment
Спасибо за ваш ответ. Вы мне ОЧЕНЬ помогли. Итак, как быстрее всего запустить мою программу? распараллелить мой m-файл с помощью параллельного набора инструментов или написать программу вне Matlab в коде C? MEX быстрее, чем .exe, если мы запускаем все из Matlab? - person George; 19.06.2012
comment
Это полностью зависит от конкретного фрагмента кода, который вы хотите ускорить. Не зная об этом больше, я бы начал с оптимизации кода MATLAB, используя такие методы, как предварительное выделение памяти и профилировщик. Затем, если части вашего кода легко распараллеливаются, использование Parallel Computing Toolbox может обеспечить очень легкий прирост скорости. Наконец, вы можете взять узкие места, выявленные профилировщиком, и перекодировать их в файл C mex. - person Sam Roberts; 20.06.2012