Я работаю над проектом 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?
Заранее спасибо за вашу доброту в чтении моей темы.