我有一个BE项目,其代码在MATLAB中,但我需要在网页上显示结果。我想知道我是否可以直接在网站上运行我的代码?如果没有,你能告诉我哪种语言会更好吗?我想的可能是ASP,HTML和PHP。
答案 0 :(得分:6)
您可以使用MATLAB编译器将MATLAB应用程序编译为独立的可执行文件。
在提示符下键入“mcrversion”以确定您是否安装了此软件包 - 如果您尚未付款,则可能不会这样做 - 与Mathworks提供的大多数扩展一样,您需要为此付费。
如果您不需要编译代码,只需运行代码,您就可以通过命令行调用MATLAB来执行您需要的代码。
正如Sinan所提到的,在这两种情况下你都会使用类似passthu的功能。
另一种方法是为PHP创建一个扩展,以便在C中使用MATLAB.MATLAB提供了一个C API,它允许您使用MATLAB附带的库来调用引擎(有关示例,请参阅“extern”文件夹)。
请参阅以下有关创建扩展程序的链接(非常简单):
http://devzone.zend.com/article/1021
在MATLAB中搜索“MATLAB C / Fortran API”或谷歌搜索有关函数的文档。基本上,您可能需要调用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扩展编译,将上面的引擎调用放到你的扩展中,你可以使用你在扩展中定义的PHP函数调用MATLAB。
编译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
答案 1 :(得分:2)
您应该可以使用passthru调用MatLab并在页面上包含其输出。
另请参阅MatLab命令行选项on Windows或on Unix。
答案 2 :(得分:2)
也许这是正确的解决方案:http://www.mathworks.com/products/new_products/webserver_discontinued.html
编辑包含以下两个页面:
答案 3 :(得分:2)
MATLAB与.NET有很好的集成。您需要MATLAB Compiler + Builder NE toolbox来创建可以从基于.NET的Web应用程序运行的.NET程序集。
一些替代方案:您可以使用R(请参阅this SO question),或者可能使用Python + numpy/scipy执行相同操作,而无需支付所有许可费用。
答案 4 :(得分:0)
您最好的选择可能是使用matlab发布命令,该命令允许您从matlab代码创建HTML。如果您不需要实时执行脚本,则可以自动生成输出并创建图形的图像副本。生成HTML和图像后,您只需将它们上传到您的网站即可。
答案 5 :(得分:0)
SaturnAPI为您的Matlab和Octave脚本提供REST接口,这样您就不必在自己的服务器上安装任何东西。它甚至可以向您发送Base64编码的3D图。这是demo。下面的图表显示您可以通过HTTP调用中的SaturnParams
变量将输入传递给脚本。
披露:我在SaturnAPI上工作
答案 6 :(得分:0)
我通过PHP使用Matlab COM Automation Server,这会运行一些方法来进行一些推导:
$Matlab = new COM("Matlab.Application.Single");
$output = $Matlab->Execute("addpath '".dirname($_SERVER['SCRIPT_FILENAME'])."/'");
$output = $Matlab->Execute("[roots, dy, subsStr] = NewtonPrep('".$_REQUEST['eq']."')");
echo $output;
https://php.net/manual/en/book.com.php
https://www.mathworks.com/help/matlab/call-matlab-com-automation-server.html
答案 7 :(得分:-1)
如果 JavaScript 是一种可能的语言选择,则MathWorks File Exchange(https://www.mathworks.com/matlabcentral/fileexchange/69973-generate-javascript-using-matlab-coder)上的此工具箱可以将MATLAB函数编译为可在浏览器中运行的JavaScript函数。