gpt4 book ai didi

c++ - 在 Visual Studio 中直接调用 MATLAB(多线程)

转载 作者:行者123 更新时间:2023-11-30 04:00:37 25 4
gpt4 key购买 nike

目前我正尝试在 Visual Studio 中直接调用 MATLAB,但它似乎不起作用。

为了清楚起见,以下面的demo为例,即使用MATLAB计算2+3。预计结果,即 ans = 5,应该打印在行 printf("%s\n", buf); 中,结果是空的.顺便说一句,MATLAB引擎打开(engOpen())成功。

#include <stdio.h>
#include <thread>
#include "engine.h"

Engine *matlab;

void thread_func()
{
// set printing buffer
char buf[1001];
engOutputBuffer(matlab, buf, 1000);

// call MATLAB
engEvalString(matlab, "2+3");
printf("%s\n", buf); // if ok, should print "ans = 5" in the command window
}

int main()
{
// Open MATLAB engine
matlab = engOpen(NULL);
if (matlab == NULL){
printf("Error to open MATLAB engine!!!\n");
exit(-1);
}

// use "Engine *matlab" in this thread
std::thread another_thread(thread_func);

// wait the thread to finish
another_thread.join();

// Close MATLAB engine
engClose(matlab);

return 0;
}

更多信息:

  • MATLAB 版本:R2014a x64
  • Visual Studio 版本:2013 Professional
  • 项目的构建平台也设置为x64。
  • 运行代码时会创建 MATLAB 命令窗口,这符合预期。

最佳答案

这是我试过的一个简单例子:

测试引擎.cpp

#include <cstdio>
#include "engine.h"

#define BUFSIZE 1000

int main()
{
// open connection
Engine *matlab = engOpen(NULL);
if (matlab == NULL) {
fprintf(stderr, "Error to open MATLAB engine\n");
return EXIT_FAILURE;
}

// output buffer
char buf[BUFSIZE+1];
buf[BUFSIZE] = '\0';
engOutputBuffer(matlab, buf, BUFSIZE);

// call MATLAB
engEvalString(matlab, "x = magic(5)");

printf("Output:\n%s\n", buf);

// close connection
engClose(matlab);

return EXIT_SUCCESS;
}

不是手动创建 Visual Studio 项目来编译它,we can do this直接来自 MATLAB:

>> mbuild test_engine.cpp -llibeng -llibmx

在 R2014a 及更高版本中,我们还可以使用:

>> mex -client engine test_engine.cpp

(假设您已运行 mex -setupmbuild -setup 以选择合适的 C++ 编译器,或在 R2014a 中运行 mex -setup C++mex -setup C++ -client MBUILD)。

这是程序的输出(我在 VS2013 上运行 R2014a x64):

C:\> test_engine.exe
Output:
x =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

编辑:

这里是 how to在 Visual Studio 中编译以上示例。

  1. 首先创建一个新的空“Win32 控制台应用程序”项目

  2. 由于我们使用的是 MATLAB x64,因此我们需要调整项目配置以生成 64 位二进制文​​件。从“构建”菜单中,选择“配置管理器”。从下拉菜单中选择 <New>要创建新的平台配置,请选择 x64并接受。

  3. 添加上一示例的源代码test_engine.cpp

  4. 下一步是告诉 VC++ 编译器/链接器在哪里可以找到 MATLAB 头文件和库。我们可以通过设置项目属性来做到这一点。

    更好的方法是创建一个单独的 property sheet可以从多个项目中重复使用,而不必一遍又一遍地重复相同的设置。所以创建 MATLAB_Engine.props如下所示的属性表,并将其添加到项目中(打开“属性管理器”面板并单击“添加现有属性表”按钮)。

  5. 最后构建解决方案并运行它(Ctrl+F5)

MATLAB_Engine.props

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<LocalDebuggerEnvironment>PATH=C:\Program Files\MATLAB\R2014a\bin\win64;%PATH%$(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>C:\Program Files\MATLAB\R2014a\extern\include;C:\Program Files\MATLAB\R2014a\extern\include\win64</AdditionalIncludeDirectories>
<PreprocessorDefinitions>IBMPC</PreprocessorDefinitions>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>C:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft</AdditionalLibraryDirectories>
<AdditionalDependencies>libmx.lib;libmex.lib;libmat.lib;libeng.lib;mclmcrrt.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>

(这适用于 64 位 Windows 上的 MATLAB R2014a。如果您将 MATLAB 安装到其他位置,请调整路径)

预期的输出:

output

提示:如果您重复测试引擎程序,那么每次它运行时都会在后台打开和关闭一个新的 MATLAB 进程。为了使开发过程中的事情变得更容易,您可以启动一个普通的 MATLAB session ,并执行下面的命令以告诉它充当自动化服务器。这样,所有引擎程序都将在保持打开状态的同一 session 中运行。

>> enableservice('AutomationServer',true);

编辑2:

MATLAB documentation明确指出引擎库不是 thread-safe (同样适用于 MEX-API 和 MAT-API)。在 Windows 系统中,独立 Engine程序通过 COM 与外部 MATLAB 进程通信接口(interface),同时它使用 pipes在 Linux/Mac 系统上为 IPC机制。

因此,如果您创建多线程应用程序,请确保只有一个线程访问引擎应用程序。

注意:仅适用于 Windows,还有另一个函数 engOpenSingleUse .它不同于 engOpen因为它创建了一个新的非共享 MATLAB 引擎 session 。这样你就可以有多个线程,每个线程都连接到不同的 session (显然工作空间是不共享的,因为每个 session 都有一个单独的地址空间)。

关于c++ - 在 Visual Studio 中直接调用 MATLAB(多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com