主要内容

c++ MEX函数的进程外执行

MATLAB®可以在单独的进程中运行c++ MEX函数。在单独的进程中运行c++ MEX函数使您能够:

  • 将MATLAB进程与c++ MEX函数中的崩溃隔离开来。

  • 在与MATLAB不兼容的C ++ MEX函数中使用一些第三方库。

  • 通过在单个进程中运行多个C ++ MEX函数来节省内存。

  • 将c++调试器附加到MEX主机进程。

  • 中断c++的MEX函数执行使用Ctrl + C

笔记

当调用进程外的c++函数时,在c++和MATLAB之间传递的变量大小被限制为2gb。这个限制适用于进程之间传递的数据和支持信息。金宝app

如何用完进程

按照以下步骤在进程外运行c++ MEX函数:

  1. 编写您的c++ MEX函数,并使用构建C ++ MEX程序.在进程内和流程外执行的函数之间没有必要的代码差异。

  2. 使用该模拟MEX主机进程mexhost函数。

  3. 使用函数宏指令的方法matlab.mex.MexHost返回的对象mexhost在主机进程中运行C ++ MEX功能。

当运行完进程时,c++ MEX函数总是在与MATLAB当前文件夹相同的文件夹中执行。在创建MEX主机对象之后,更改MATLAB当前文件夹会导致c++ MEX函数上下文中的相同变化。

运行ArrayProduct.MEX函数脱离过程

下面的示例运行ArrayProduct.c++的MEX函数进程外。该文件提供了c++ MEX源代码arrayProduct.cpp.要使用这个示例c++ MEX函数,请打开arrayProduct.cpp源文件,将其保存在MATLAB路径中,并使用构建C ++ MEX程序

在构建了c++ MEX函数之后,使用mexhost函数。的对象的对象matlab.mex.MexHost类。

使用函数宏指令方法来运行ArrayProduct.在主机进程中使用c++的MEX函数。将c++ MEX函数名和参数传递给函数宏指令.将结果赋值给MATLAB函数宏指令

mh = mexhost;结果= feval(mh,“arrayProduct”,2,[1 2 3 4])
结果= 2 4 6 8

运行ArrayProduct.在另一个MEX主机进程中。首先通过调用创建MEX主机进程mexhost再次并将输出分配给不同的变量。然后打电话函数宏指令在新主机上。

mh2 = mexhost;结果2. Feval(MH2,“arrayProduct”2,兰德(10));

您可以使用相同的过程运行其他C ++ MEX函数matlab.mex.MexHost返回的对象mexhost

结果2. Feval(MH2,“anotherMexFunction”,输入);

处理生命周期

MEX主机进程生命周期耦合到生命周期matlab.mex.MexHost返回的对象mexhost.与任何句柄对象一样,MATLAB调用删除方法,当对象不再在任何地方引用时。如果MATLAB调用删除或者如果你打电话删除对对象进行显式处理,MATLAB结束与关联的过程MexHost目的。

的方法可以显式结束该过程清晰的使用以下任何选项的功能:

  • 清晰的函数返回的变量mexhost函数

  • 清晰的清晰的java,或清晰的所有

重建一个c++ MEX函数

墨西哥人命令在重新构建之前自动卸载c++ MEX函数。因此,您不需要显式地从MEX主机进程卸载c++ MEX函数。

您可以显式地从一个MEX主机进程卸载所有c++ MEX函数清晰的墨西哥人清晰的功能.通过调用卸载特定的C ++ MEX功能清晰的函数名。

要防止卸载C ++ MEX功能,请使用mexLock函数。解锁C ++ MEX功能,使用Mexunlock..这些函数在宿主进程上为c++ MEX函数设置或取消设置一个标志,以控制c++ MEX函数的卸载。

获取MEX主机进程信息

使用matlab.mex.MexHost对象获取有关MEX主机进程的信息。这些属性提供有关流程和加载函数的信息。

  • EnvironmentVariables包含为流程设置的环境变量的名称和值。

  • 功能包含加载到MEX主机进程中的所有C ++ MEX函数的名称。

  • ProcessName包含MEX主机进程的名称,即MATLABMexHost默认情况下。

  • ProcessIdentifier包含进程标识符。

有关这些属性的更多信息,请参见matlab.mex.MexHost

总是用尽进程

在某些情况下,您可能总是希望在进程外运行c++ MEX函数。例如,如果MATLAB和c++ MEX函数之间存在第三方库冲突,则可能需要耗尽进程。

为了提供一种方便的方式来运行c++ MEX函数的进程外,创建一个包装MATLAB函数。包装器函数创建MEX主机对象,并在该进程中运行c++ MEX函数。

例如,假设您想要为arrayProduct.cppC ++ MEX函数作为示例包含在文档中。使用名称创建MATLAB函数arrayProduct.m然后把这个文件放到MATLAB路径下的一个文件夹中。构建c++ MEX函数,并为编译后的MEX文件指定一个不同的名称。

包装函数创建一个matlab.mex.MexHost分配给持久变量的对象使得该进程不会在对包装函数的后续调用之间销毁。该函数使用此对象调用函数宏指令方法用于在进程外执行c++ MEX函数。如果MEX主机对象无效,那么该函数将创建一个MEX主机进程。

函数结果= arrayProduct (scalefactor inputarray)执着的mh如果~ (isa (mh),“matlab.mex.MexHost”) && isvalid(mh) mh = mexhost;结尾结果= feval(mh,“arrayProductMEX”、scalefactor inputarray);结尾

要构建c++ MEX函数,请打开arrayProduct.cpp源文件并将其保存在Matlab路径上。使用本主题中的说明构建C ++ MEX功能,构建C ++ MEX程序

以下命令用根名构建MEX文件ArrayProductMex.并将其放入带有包装器函数的文件夹中mypathfolder.在这个例子中。这墨西哥人命令创建不存在的文件夹。

墨西哥人与产出ArrayProductMex.-outdir.mypathfolder.arrayProduct.cpp

要使用C ++ MEX功能,请通过包装函数从命令行调用它。

result = arrayProduct(2,[1 2 3 4]);结果
结果= 2 4 6 8

以下代码调用C ++ MEX功能为了循环。第一个呼叫ArrayProduct.创建MEX主机进程。后续调用使用相同的过程,除非该过程被例如C ++ MEX函数的崩溃崩溃。

为了k = 1:5 results(k,:) = arrayProduct(k,[1 2 3 4]);结尾结果
结果= 12 3 4 2 4 6 8 3 6 9 12 4 8 12 16 5 10 15 20

要销毁MEX主机进程,清除定义MEX主机进程变量的所有函数(mh在本例中)为persistent。在本例中,清除arrayProduct.m函数。

清晰的arrayProduct.m

调用清晰的功能造成的破坏matlab.mex.MexHost存储在持久变量中并因此终止MEX主机进程的对象。

调试流程超出MEX功能

您可以将C ++调试器附加到C ++ MEX功能,并设置断点以调试程序。以下是设置和调试C ++ MEX功能的步骤。

  • 编译c++ MEX源代码使用墨西哥人命令- g选项以包括调试符号。

  • 使用该创建主机进程mexhost函数。的对象的对象matlab.mex.MexHost

  • 的进程标识符matlab.mex.MexHost目的ProcessIdentifier财产。

  • 使用进程标识符将c++调试器附加到进程。

  • 在源代码中插入断点。

  • 控件在进程外运行c++ MEX函数函数宏指令方法。

有关使用特定调试器的信息,请参阅这些调试器的文档。

调试使用微软视觉工作室

  1. 确保Visual Studio®是您选择的c++编译器。这个示例使用微软®视觉工作室2015年。

    cpp = mex.getCompilerConfigurations (“c++”'选择');cpp。的名字
    ans = 'Microsoft Visual c++ 2015'
  2. 编译您的c++ MEX源代码使用墨西哥人命令- g选项。此示例假定您有一个名为C ++ MEX源文件mymexfunction.cpp.

    墨西哥人- gmymexfunction.cpp.
  3. 创建一个MEX主机进程并返回MexHost目的。

    mh = mexhost;
  4. 启动Visual Studio。不要退出MATLAB会话。

  5. 从Visual Studio调试菜单,选择附加到过程

    在“附件”处理对话框中,选择MATLABMexHost过程,然后单击附加

  6. Visual Studio加载数据,然后显示一个空的代码窗格。

  7. 单击打开C ++ MEX源文件文件>开放>文件并选择文件。

  8. 通过右键单击所需的代码和单击,设置断点断点>插入断点在上下文菜单上。

  9. 在MATLAB中,在进程外运行c++ MEX函数matlab.mex.MexHost函数宏指令方法。

    结果= feval(mh,“myMexFunction”input1 input2,...
  10. 使用调试器提供的功能来调试源代码。

在调试Linux.系统

在Linux上®系统,您可以使用Debugger等GNU®广东发展银行调试器。按照以下步骤使用广东发展银行调试器。

  1. 编译您的c++ MEX源代码使用墨西哥人命令- g选项。此示例假定您有一个名为C ++ MEX源文件mymexfunction.cpp.

    墨西哥人- gmymexfunction.cpp.
  2. 创建一个MEX主机进程并返回MexHost目的。

    mh = mexhost;
  3. 的进程标识符ProcessIdentifier财产的MexHost目的。返回值是表示MEX主机进程的标识符的字符串。例如,

    mh.ProcessIdentifier
    ans =“13892”

    对于创建的每个进程,进程标识符是不同的。

  4. 从Linux终端将调试器附加到MEX主机进程。例如,使用GNU广东发展银行调试器,叫广东发展银行使用c++ MEX文件名和进程标识符,这是从MATLAB中的MEX主机对象获得的:

    gdb mymexfunction -pid = 13892
  5. 在C ++ MEX功能中设置断点。例如,使用广东发展银行,设置断点mymexfunction.cpp.在第21行:

    打破mymexfunction.cpp:21
  6. 从MATLAB,使用C ++ MEX功能使用matlab.mex.MexHost函数宏指令方法。

    结果= feval(mh,“myMexFunction”input1 input2,...

    MATLAB等待调试器的响应。

  7. 在Linux终端上,使用调试器提供的特性来调试源代码。

在调试麦金塔电脑系统

麦金塔电脑系统,使用LLDB调试器。

  1. 编译您的c++ MEX源代码使用墨西哥人命令- g选项。此示例假定您有一个名为C ++ MEX源文件mymexfunction.cpp.

    墨西哥人- gmymexfunction.cpp.
  2. 创建一个MEX主机进程并返回MexHost目的。

    mh = mexhost;
  3. 的进程标识符ProcessIdentifier财产的MexHost目的。返回值是表示MEX主机进程的标识符的字符串。

    mh.ProcessIdentifier
    ans =“13892”

    对于创建的每个进程,进程标识符是不同的。

  4. 控件将调试器附加到MEX主机进程苹果系统终端。调用lldb使用您从MATLAB中的MEX主机对象获取的MEX主机进程标识符。例如,假设进程标识符是13892,将LLDB调试器附加到此过程:

    lldb - p 13892
  5. 在源代码中设置断点。例如,该命令在mymexfunction.cpp.在第21行。

    断点设置-f myMexFunction.cpp
  6. 从MATLAB,使用C ++ MEX功能使用matlab.mex.MexHost函数宏指令方法。

    结果=函数宏指令(mh 'myMexFunction input1 input2,...

    MATLAB等待调试器的响应。

  7. 输入C继续苹果系统终端。程序执行停止在断点。

  8. 苹果系统终端,使用调试器提供的特性来调试您的源代码。

也可以看看

|

相关的话题