php - 我可以在网站上运行 MATLAB 代码吗?

标签 php matlab

我有一个 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

关于php - 我可以在网站上运行 MATLAB 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1451503/

相关文章:

python - 具有多个输入的 Scipy LinearOperator

html - 将自动生成的 Matlab 文档导出到 html

linux - 为什么 savepath 在 Matlab 中重置用户路径?

matlab - 具有滑动窗口元素的矩阵

matlab - 频域与空域滤波

php - CSS中奇怪的图片分辨率

php - 如何使用 php 清理特定标签的 textarea 输入

php - Laravel - 查询生成器 - 按标签数量对结果进行排序

php - 调用 bool 值 (xampp) 上的成员函数 fetch()

php - 如何在 codeigniter 数据表查询中使用 CONCAT?