【发布时间】:2017-02-03 20:03:32
【问题描述】:
The MATLAB Engine API 允许从 C 程序访问 MATLAB 功能。要设置 MATLAB 引擎会话,请调用 engOpen 函数。默认情况下,这会启动一个新的 MATLAB 实例,专供引擎应用程序使用。
我想要的是使用引擎应用程序中的已经运行的 MATLAB 会话,以便我可以访问其变量。我需要在 Linux 和 OS X 上执行此操作。
Engine 接口在 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 会话,设置一个变量 a=5,然后启动 Python,连接到同一个会话并能够检索这个变量。 It is also possible to connect to an already running session from Java.
我需要从 C 中执行此操作,而不是从 Python,因为它将用于 MATLink,Mathematica-MATLink 接口。 Python 接口是如何实现这一点的?如何使用 C 重现相同的内容?
如果有一个替代 C API 而非“MATLAB 引擎”可以实现这一点(可能是 Python 接口所基于的其他一些已记录或未记录的 C API),我可以接受它作为答案。我想要一个可以利用已经运行的 interactive MATLAB 会话的 C 程序。
更新:
对 Python 界面的一些探索表明它使用了一个名为 libmwengine_api 的库。这与记录在案的 MATLAB Engine C API 不同。我们可以查看这个库中的符号。在 OS X 上,
nm -g libmwengine_api.dylib | c++filt
然后我们可以用 google 搜索这些符号,或者 grep MATLAB 安装目录中包含它们的文件。纯文本中没有任何内容。
基于此,我认为 Python 接口使用了一种未记录的 C++ 引擎 API,它不同于旧的、记录在案的 C 引擎 API。
【问题讨论】:
-
我觉得如果有替代的API,肯定是和
libmwengine_api库相关的。在这个库中列出符号表明它是 C++,而不是 C。这对我来说不是问题,我还是使用 C++。grepping 整个 MATLAB 安装目录,例如findSharedMATLAB没有显示任何相关的头文件(只有二进制文件),这强烈表明此接口未记录。 -
它是很久以前废弃的图书馆的一部分。
-
你找到答案了吗?
-
@SurajJain 不幸的是,没有。看起来这个替代引擎 API 是通过 C/C++ 的唯一途径,并且没有记录。我不认为你是正确的,它是过时的,因为你的链接提到了其他具有相似但不同名称的库。我认为它从未被记录在案。一种解决方案可能是使用 Java API,它具有所需的功能并已记录在案。 MathWorks 支持人员告诉我,目前无法在 OS X 和 Linux 上使用 C(或 C++)实现我想要的功能。只能在 Windows 上使用。
标签: c linux macos matlab matlab-engine