The MATLAB Engine API允许从 C 程序访问 MATLAB 功能。要设置 MATLAB 引擎 session ,请调用 engOpen
功能。默认情况下,这会启动一个新的 MATLAB 实例,专供引擎应用程序使用。
我想要的是从引擎应用程序使用一个已经在运行的 MATLAB session ,这样我就可以访问它的变量。我需要在 Linux 和 OS X 上执行此操作。
引擎接口(interface)在 Windows(它使用 COM 服务器)和 Unix 上有非常不同的实现。在 Unix 上,我们必须将 MATLAB 可执行文件的位置传递给 engOpen
,而在 Windows 上(引擎使用 COM 服务器)我们不需要。在 Windows 上,可以将现有的 MATLAB 实例用于引擎应用程序:只需运行 enableservice('AutomationServer', true)
. Unix系统上有解决办法吗?
我希望有一个通用的解决方案——也许没有记录——因为,based on the documentation, the Python interface seems to allow this .我在 OS X 上测试过它,它可以工作。例如,我可以启动交互式 MATLAB session ,设置变量 a=5
,然后启动 Python,将连接到同一 session 并能够检索该变量. It is also possible to connect to an already running session from Java.
但是,我需要从 C 中执行此操作,而不是从 Python 中执行此操作,因为它将在 MATLink 中使用, Mathematica-MATLink 接口(interface)。 Python 接口(interface)如何实现这一点?我如何使用 C 重现相同的内容?
如果除了“MATLAB 引擎”之外还有其他 C API 使这成为可能(可能是 Python 接口(interface)所基于的其他一些已记录或未记录的 C API),我可以接受它作为答案。我想要一个可以利用已在运行的交互式 MATLAB session 的 C 程序。
更新:
一些在 Python 接口(interface)中四处寻找的人发现它使用了一个名为 libmwengine_api
的库。这与记录的 MATLAB 引擎 C API 不同。我们可以看看这个库中的符号。在 OS X 上,
nm -g libmwengine_api.dylib | c++filt
然后我们可以用 google 搜索这些符号或 grep MATLAB 安装目录以查找包含它们的文件。纯文本中没有任何内容出现。
基于此,我认为 Python 接口(interface)使用了一个未记录的 C++ 引擎 API,它与旧的、有记录的 C 引擎 API 不同。
最佳答案
关于使用 MATLAB Engine 连接到已在运行的 MATLAB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39703491/