【问题标题】:Can I run MATLAB code on a web site?我可以在网站上运行 MATLAB 代码吗?
【发布时间】:2009-09-20 17:23:25
【问题描述】:

我有一个 BE 项目,其代码在 MATLAB 中,但我需要在网页上显示结果。我想知道我是否可以直接在网站上运行我的代码?如果不是,你能告诉我哪种语言更好吗?我在想也许是 ASP、HTML 和 PHP。

【问题讨论】:

    标签: php matlab


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

      【解决方案2】:

      您应该能够使用 passthru 调用 MatLab 并将其输出包含在页面上。

      另见 MatLab 命令行选项 on Windowson Unix

      【讨论】:

      • matlab 的 Web UI 是否有新技术,您可以在其中创建按钮、文件上传按钮和文本输入等界面?
      【解决方案3】:

      MATLAB 与 .NET 有很好的集成。您需要 MATLAB Compiler + Builder NE toolbox 来创建可以从基于 .NET 的 Web 应用程序运行的 .NET 程序集。

      一些替代方案:您可以使用 R(请参阅 this SO question)或 Python + numpy/scipy 做很多相同的事情,而无需支付所有许可费用。

      【讨论】:

        【解决方案4】:

        【讨论】:

        • 因为它已经停产了,所以我不会赌太多。
        • 但该页面还包含两个选项。
        • 为了避免误会做了修改,抱歉,是我的错。
        【解决方案5】:

        如果 JavaScript 是一种可能的语言选择,那么 MathWorks 文件交换 (https://www.mathworks.com/matlabcentral/fileexchange/69973-generate-javascript-using-matlab-coder) 上的这个工具箱可以将 MATLAB 函数编译成可以在浏览器中运行的 JavaScript 函数。

        【讨论】:

        • 欢迎来到stackoverflow。最佳做法是在您的答案中包含示例代码。外部链接可能会中断。
        【解决方案6】:

        您最好的选择可能是使用 matlab 发布命令,它允许您从 matlab 代码创建 HTML。如果您真的不需要实时执行脚本,这将允许您自动生成输出并创建图形的图像副本。生成 HTML 和图像后,您可以简单地将它们上传到您的站点。

        publish command reference

        【讨论】:

          【解决方案7】:

          SaturnAPI 为您的 Matlab 和 Octave 脚本提供 REST 接口,因此您无需在自己的服务器上安装任何东西。它甚至可以向您发送 Base64 编码的 3D 图。这是demo。下图显示您可以通过 HTTP 调用中的 SaturnParams 变量将输入传递给脚本。

          披露:我在 SaturnAPI 上工作

          【讨论】:

            【解决方案8】:

            我通过 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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-14
              • 1970-01-01
              • 2012-07-14
              • 2017-07-10
              • 2016-09-22
              相关资源
              最近更新 更多