0

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

具体来说,我的程序会读取一个配置文件以获取各种 matlab 程序的名称以及其他信息。然后它使用该信息向学生展示选择。因此,如果分配更改、添加或删除,那么您所要做的就是更改配置文件。

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

问题是,当我这样做时,显然,mcc 将分级机 m 代码吸收到自身中;编译后更改grader m代码没有效果。我希望这不会发生。我注意到 Mathworks 可能不希望我这样做,因为它可以完全绕过 matlab。这不是我的本意,我会对需要完整安装 matlab 的解决方案感到满意。

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

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

4

3 回答 3

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 函数。
    • 您还可以使用命名管道。有关详细信息,请参阅此MATLAB 新闻组线程

更新:上面的选项 #3 是MATLAB 引擎的有效工作方式,因此您最好直接使用它。

于 2010-03-15T15:59:35.993 回答
0

使用 MATLAB 引擎从 C/C++ 和 Fortran 程序调用 MATLAB 软件

于 2010-03-14T23:10:08.647 回答
0

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

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

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

于 2010-03-14T18:05:10.343 回答