Вы можете скомпилировать ваше приложение MATLAB в отдельный исполняемый файл, используя компилятор MATLAB.
Введите «mcrversion» в ответ на запрос, чтобы определить, установлен ли у вас этот пакет. Вероятно, вы этого не сделаете, если не заплатили за него. Как и в случае большинства расширений, предоставляемых Mathworks, вам необходимо заплатить за него.
Если вам не нужно компилировать код, а просто запустить его, вы можете вызвать MATLAB из командной строки, чтобы сделать то, что вам нужно.
Как упоминал Синан, в обоих случаях вы бы использовали функцию, подобную passthu.
Другой альтернативой является создание расширения для PHP для использования MATLAB в C. MATLAB предоставляет C API, который позволяет вам вызывать движок с использованием библиотек, которые поставляются с MATLAB (см. Примеры в вашей папке "extern").
См. Следующую ссылку по созданию расширения (это довольно просто):
http://devzone.zend.com/article/1021
Поиск "MATLAB C / Fortran API" в MATLAB или Google для документации по функциям. По сути, вам, вероятно, потребуется вызвать EngOpen, чтобы вызвать движок и вернуть указатель.
Оцените строку, используя engEvalString (вы можете загрузить файлы .m таким образом или сделать все, что вы могли бы сделать в обычной командной строке matlab).
Когда вам нужно увидеть результаты (все, что обычно выводится в командную строку в matlab), просто пропустите точку с запятой после команды и используйте engOutputBuffer для захвата вывода.
Вот упрощенный пример из того, что я написал:
#include "mat.h"
#include "engine.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 256
int main()
Engine *ep;
char buffer[BUFFER_SIZE]; // The buffer used to capture output.
buffer[BUFFER_SIZE] = '\0'; /* Terminate the last character of the buffer. */
if (!(ep = engOpen(NULL))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
if (engEvalString(ep, "load data/mymatfile.mat") != 0)
printf("error evaluating expression\n");
engOutputBuffer(ep, buffer, BUFFER_SIZE);
/* No output returned. */
if (engEvalString(ep, "p = 1+1;") != 0)
printf("error evaluating expression\n");
/* Output written to buffer- Note the omitted character (;). */
if (engEvalString(ep, "q = p+1 "))
printf("error evaluating expression\n");
/* You will probably need to trim the whitespace in the buffer contents.
I estimated +5 to pull out the prompt: ">>", but it depends on which version
you have, for example, the student version displays "EDU >>\n". */
printf("print the contents of the buffer:%s\n", buffer+5);
/* Turn off output buffering. */
engOutputBuffer(ep, NULL, 0);
/* Close the engine. */
engClose(ep);
exit(0);
}
После того как вы получили скомпилированное базовое расширение PHP, добавьте вызовы вышеупомянутого механизма в ваше расширение, и вы можете вызывать MATLAB, используя функцию PHP, которую вы определили в своем расширении.
Компиляция MATLAB API, вероятно, самая сложная часть. Вот содержимое моего Makefile (без кода расширения PHP).
phpmat: phpmat.o
gcc phpmat.o
/usr/local/matlabR2009a/extern/lib/glnx86/version4.o
/usr/local/matlabR2009a/bin/glnx86/libeng.so
/usr/local/matlabR2009a/bin/glnx86/libmex.so -o phpmat
phpmat.o: phpmat.c
gcc -c phpmat.c -I/usr/local/matlabR2009a/extern/include
-L/usr/local/matlabR2009a/extern/lib/glnx86
-L/usr/local/matlabR2009a/bin/glnx86
-L/usr/local/matlabR2009a/sys/os/glnx86 -L/usr/local/matlabR2009a/bin/glnx86
clean:
rm *.o
Вам, вероятно, нужно будет установить LD_LIBRARY_PATH перед компиляцией / вызовом расширения ... Однако есть альтернативы этому:
LD_LIBRARY_PATH=/usr/local/matlabR2009a/extern/lib/glnx86:/usr/local/matlabR2009a/bin/glnx86:/usr/local/matlabR2009a/sys/os/glnx86:$LD_LIBRARY_PATH