MATLAB任意代码执行

时间:2010-03-14 17:56:09

标签: c++ c matlab mex mcc

我正在linux下编写一个自动分级程序。有几个用MATLAB编写的评分者,所以我想将它们组合在一起,让学生运行一个程序来完成作业,让他们选择作业。我正在使用一个C ++主程序,然后将mcc编译的MATLAB库链接到它。

具体来说,我的程序读取配置文件以获取各种matlab程序的名称以及其他信息。然后,它使用该信息向学生提供选择。因此,如果分配更改,添加或删除,那么您只需更改配置文件。

接下来,程序会调用已使用mcc编译的正确matlab库。但是,这意味着如果更改分级器,则必须重新编译库。更糟糕的是,如果添加或删除分级程序,则必须重新编译整个程序。所以,我想要一个简单,不变的matlab库函数来直接调用分级器m文件。我目前有这样一个库,它在从主程序传递给它的字符串上使用eval。

问题在于,当我这样做时,显然,mcc将分级m代码吸收到自身中;编译后更改分级器m代码无效。我希望不会发生这种情况。引起我的注意,Mathworks可能不希望我能够做到这一点,因为它可以完全绕过matlab。这不是我的意图,我很满意需要完整的matlab安装的解决方案。

我可能的解决方案是使用mex文件作为主程序,或让主程序调用一个mcc库,然后调用一个mex文件,然后调用正确的分级器。我对第一个解决方案犹豫不决的原因是我不确定我需要对我的代码进行多少更改才能使其工作;我的代码是C ++,而不是C,我认为这会使事情变得更复杂。但是,第二种解决方案可能会更复杂,最终会出现同样的问题。

那么,有关这种情况的任何想法?我该怎么做?

3 个答案:

答案 0 :(得分:2)

您似乎选择了解决问题的最复杂方法。以下是一些替代方案:

  1. 根本不使用C / C ++ - 编写MATLAB程序以显示选项菜单(MATLAB命令窗口中的简单文本菜单的GUI),然后调用相应的MATLAB评分程序

  2. 用C / C ++编写菜单程序,但是使用-r参数调用MATLAB来运行特定的评分程序(为了加快启动时间,请使用-nodesktop,-nojvm或-nodisplay选项) )。但请注意,每次菜单选择都会重新启动MATLAB。

  3. 用C / C ++编写菜单程序,并使用popen命令启动MATLAB(这将在C ++程序和MATLAB过程之间建立管道)。在用户选择菜单后:

    • 您的C ++程序将MATLAB程序的名称(以及任何参数)写入管道。
    • 在MATLAB端,将MATLAB程序写入该管道上的阻塞读取。当它读取命令时,它会调用相应的MATLAB函数。
    • 您也可以使用named pipes。有关详细信息,请参阅此MATLAB newsgroup thread
  4. 更新:上面的选项#3实际上是MATLAB engine的工作原理,因此您最好直接使用它。

答案 1 :(得分:0)

不要将此作为mex功能。

使用必须在matlab中执行的常规m文件。如果您不想先启动matlab,请编写一个bat文件。我相信-r或-m运行一个给定的命令(在运行ml函数之前你必须cd到正确的目录)。

使用mex编译c ++代码首先安装visual studio。然后运行(在matlab中)mex -setup。选择“找到已安装的编译器”或其他类似的,然后从列表中选择您的编译器。现在mex将编译c ++代码。

答案 2 :(得分:0)