使用 MATLAB Engine 连接到已在运行的 MATLAB

标签 c linux macos matlab matlab-engine

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/

相关文章:

c - 从文件读取时出现错误

linux - Bluez 5.48 - 如何强制蓝牙传输状态从事件到空闲 - 嵌入式接收器端

c - 使用 FUSE 在 C 中编写一个简单的文件系统

linux - getsockname() 没有 bind()

ruby-on-rails - pg gem 无法通过捆绑安装进行安装或根本无法安装

objective-c - NSOpenPanel 选择目录(不是文件)

macos - 找不到 hadoop start-xxx.sh 命令和语法错误

c - fork() - 多进程和系统调用

c++ - c语言实现密码安全的程序?

c - VirtualBox 如何处理 guest Linux 的中断?