Вызовите функцию внешним приложением, не открывая новый экземпляр Matlab

Есть ли способ вызвать функции Matlab извне, в частности, Windows cmd (но также и терминал Linux, LUA-скрипты и т. Д.), БЕЗ открытия нового экземпляра Matlab каждый раз?

например, в cmd :

 matlab -sd myCurrentDirectory -r "function(parameters)" -nodesktop -nosplash -nojvm 

открывает новый экземпляр Matlab относительно быстро и выполняет мою функцию. Открытие и закрытие этого сокращенного приглашения matlab занимает около 2 секунд (без вычислений) – следовательно, для 4000 казней более 2 часов. Я хотел бы избежать этого, поскольку вызываемая функция всегда находится в одной рабочей области. Можно ли это сделать в том же экземпляре всегда?

Я уже провел некоторые исследования и нашел возможность сервера MATLAB COM Automation Server , но мне кажется, что это довольно сложно, и я не вижу необходимых шагов, чтобы заставить его работать для моего дела. Любые советы для этого?

Я не знаком с c/c++/c# но я думаю об использовании python (но только в худшем случае).

    Основываясь на неработающей, но продуманной идее @Ilya Kobelevskiy здесь окончательное решение:

      function pipeConnection(numIterations,inputFile) for i=1:numIterations while(exist('inputfile','file')) load inputfile; % read inputfile -> inputdata output = myFunction(inputdata); delete('inputfile'); end % Write output to file % Call external application to process output data % generate new inputfile end; в  function pipeConnection(numIterations,inputFile) for i=1:numIterations while(exist('inputfile','file')) load inputfile; % read inputfile -> inputdata output = myFunction(inputdata); delete('inputfile'); end % Write output to file % Call external application to process output data % generate new inputfile end; 

    Другим удобным решением было бы скомпилировать исполняемый файл функции Matlab:

     mcc -m myfunction 

    запустите этот .exe -файл с помощью cmd :

     cd myCurrentDirectory && myfunction.exe parameter1 parameter2 

    Имейте в виду, что параметры теперь передаются как строки, и исходный .m -файл должен быть скорректирован с учетом этого.

    дополнительные замечания:

    • Я думаю, Matlab еще нужно установить в систему, хотя нет необходимости запускать его.
    • Я не знаю, насколько этот метод ограничен, соответственно сложность базовой функции.
    • Ускорение по сравнению с первоначальным утверждением, данным в вопросе, относительно невелико

    Среди нескольких методов, представленных здесь, есть одно обходное решение, которое должно сократить время выполнения ваших многочисленных вызовов matlab. Идея состоит в том, чтобы несколько раз запускать пользовательскую функцию внутри сеанса matlab.

    Например, функция myRand.m определяется как

     function r = myRand(a,b) r = a + (ba).*rand; 

    В командном окне matlab мы генерируем команду с одной строкой, подобную этой

     S = [1:5; 1:5; 101:105]; cmd_str = sprintf('B(%d) = myRand(%d,%d);', S) 

    Он генерирует следующую командную строку B(1) = myRand(1,101);B(2) = myRand(2,102);B(3) = myRand(3,103);B(4) = myRand(4,104);B(5) = myRand(5,105); который выполняется в течение одного сеанса matlab с

     matlab -nojvm -nodesktop -nosplash -r "copy_the_command_string_here"; 

    Одним из ограничений является то, что вам нужно запустить 4000 вызовов функций в строке.

    Мне нравится подход, предложенный Magla, но с учетом ограничений, указанных в вашем комментарии к нему, его можно улучшить, чтобы по-прежнему запускать одну функцию в одном сеансе Matlab.

    Идея состоит в том, чтобы направить ваши входы и выходы. Для входов вы можете проверить, существует ли определенный входной файл, если он это делает, прочитать ввод для вашей функции из него, выполнить работу, записать вывод в другой файл, чтобы обработать результаты обработки скрипта / функции, чтобы он выполнял функцию matlab и ждет следующий ввод.

    Это очень просто реализовать с использованием дисковых файлов, с некоторыми усилиями, вероятно, это возможно сделать через диск с памятью (т. Е. Открыть ввод / вывод в ОЗУ).

     function pipeConnection(numIterations,inputFile,outputFile) for i=1:numIterations while(!isfile(inputFile)) sleep(50); end; % Read inputs output = YourFunction(x,y,z); % Write output to file, go to next iteration end; return; в function pipeConnection(numIterations,inputFile,outputFile) for i=1:numIterations while(!isfile(inputFile)) sleep(50); end; % Read inputs output = YourFunction(x,y,z); % Write output to file, go to next iteration end; return; 

    Если при запуске число итераций неизвестно, вы также можете кодировать условия выхода во входном файле, а не указывать количество итераций сразу.

    Если вы запускаете MATLAB из командной строки с параметром -r так, как вы описываете, тогда он всегда будет запускать новый экземпляр, как вы описываете. Я не верю, что есть способ обойти это.

    Если вы вызываете MATLAB из приложения C / C ++, MATLAB предоставляет интерфейс движка MATLAB , который будет подключаться к любому запущенному экземпляру MATLAB.

    В противном случае интерфейс MATLAB Automation Server, о котором вы упоминаете, является правильным способом. Если вам сложно это сделать, я бы предложил опубликовать отдельный вопрос с подробным описанием того, что вы пробовали, и с какими трудностями вы столкнулись.

    Для полноты я упомянул, что MATLAB также имеет недокументированный интерфейс, который можно вызывать непосредственно с Java, однако, поскольку он недокументирован, очень сложно получить право и может быть изменено в разных версиях, поэтому вы не должны полагаться на него.


    Изменить: Начиная с R2014b, MATLAB предоставляет MATLAB Engine для Python, через который вы можете автоматизировать MATLAB из сценария Python. А с R2016b существует также MATLAB Engine для Java. Если кто-то ранее рассматривал недокументированные Java-технологии, упомянутые выше, теперь это будет способ пойти.

    Давайте будем гением компьютера.