2010-03-14 63 views
0

我在linux下编写了一个自动分级程序。有几个在MATLAB中编写的评分程序,所以我想将它们全部绑在一起,并让学生运行程序来完成作业,并让他们选择作业。我正在使用C++主程序,然后将mcc编译的MATLAB库链接到它。MATLAB任意代码执行

具体来说,我的程序读取了各种matlab程序名称和其他信息的配置文件。然后它使用该信息向学生呈现选择。所以,如果一个任务改变,被添加或删除,那么你所要做的就是改变配置文件。

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

问题是,当我这样做时,显然,mcc吸收了分级器m代码本身;编译后更改分级器m代码不起作用。我想这不会发生。它引起了我的注意,Mathworks可能不希望我能够做到这一点,因为它可以完全绕过matlab。这不是我的意图,我会很高兴需要完整的matlab安装解决方案。

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

那么,对这种情况有什么想法?我应该怎么做?

回答

0

不要使它成为一个mex函数。

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

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

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

更新:选项#3上面实际上是如何MATLAB engine的作品,所以你可能会更好过直接使用。