【发布时间】:2009-09-20 17:23:25
【问题描述】:
我有一个 BE 项目,其代码在 MATLAB 中,但我需要在网页上显示结果。我想知道我是否可以直接在网站上运行我的代码?如果不是,你能告诉我哪种语言更好吗?我在想也许是 ASP、HTML 和 PHP。
【问题讨论】:
我有一个 BE 项目,其代码在 MATLAB 中,但我需要在网页上显示结果。我想知道我是否可以直接在网站上运行我的代码?如果不是,你能告诉我哪种语言更好吗?我在想也许是 ASP、HTML 和 PHP。
【问题讨论】:
您可以使用 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
【讨论】:
您应该能够使用 passthru 调用 MatLab 并将其输出包含在页面上。
另见 MatLab 命令行选项 on Windows 或 on Unix。
【讨论】:
MATLAB 与 .NET 有很好的集成。您需要 MATLAB Compiler + Builder NE toolbox 来创建可以从基于 .NET 的 Web 应用程序运行的 .NET 程序集。
一些替代方案:您可以使用 R(请参阅 this SO question)或 Python + numpy/scipy 做很多相同的事情,而无需支付所有许可费用。
【讨论】:
【讨论】:
如果 JavaScript 是一种可能的语言选择,那么 MathWorks 文件交换 (https://www.mathworks.com/matlabcentral/fileexchange/69973-generate-javascript-using-matlab-coder) 上的这个工具箱可以将 MATLAB 函数编译成可以在浏览器中运行的 JavaScript 函数。
【讨论】:
您最好的选择可能是使用 matlab 发布命令,它允许您从 matlab 代码创建 HTML。如果您真的不需要实时执行脚本,这将允许您自动生成输出并创建图形的图像副本。生成 HTML 和图像后,您可以简单地将它们上传到您的站点。
【讨论】:
我通过 PHP 使用 Matlab COM 自动化服务器,这运行了一个进行一些推导的方法:
$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
【讨论】: