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函数:
编写您的c++ MEX函数,并使用构建C ++ MEX程序.在进程内和流程外执行的函数之间没有必要的代码差异。
使用该模拟MEX主机进程mexhost
函数。
使用函数宏指令
的方法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函数。因此,您不需要显式地从MEX主机进程卸载c++ MEX函数。
您可以显式地从一个MEX主机进程卸载所有c++ MEX函数清晰的
墨西哥人
或清晰的
功能
.通过调用卸载特定的C ++ MEX功能清晰的
函数名。
要防止卸载C ++ MEX功能,请使用mexLock
函数。解锁C ++ MEX功能,使用Mexunlock.
.这些函数在宿主进程上为c++ MEX函数设置或取消设置一个标志,以控制c++ 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.cpp
C ++ 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主机进程的对象。
您可以将C ++调试器附加到C ++ MEX功能,并设置断点以调试程序。以下是设置和调试C ++ MEX功能的步骤。
编译c++ MEX源代码使用墨西哥人
命令- g
选项以包括调试符号。
使用该创建主机进程mexhost
函数。的对象的对象matlab.mex.MexHost
.
的进程标识符matlab.mex.MexHost
目的ProcessIdentifier
财产。
使用进程标识符将c++调试器附加到进程。
在源代码中插入断点。
控件在进程外运行c++ MEX函数函数宏指令
方法。
有关使用特定调试器的信息,请参阅这些调试器的文档。
确保Visual Studio®是您选择的c++编译器。这个示例使用微软®视觉工作室2015年。
cpp = mex.getCompilerConfigurations (“c++”那'选择');cpp。的名字
ans = 'Microsoft Visual c++ 2015'
编译您的c++ MEX源代码使用墨西哥人
命令- g
选项。此示例假定您有一个名为C ++ MEX源文件mymexfunction.cpp.
.
墨西哥人- gmymexfunction.cpp.
创建一个MEX主机进程并返回MexHost
目的。
mh = mexhost;
启动Visual Studio。不要退出MATLAB会话。
从Visual Studio调试菜单,选择附加到过程.
在“附件”处理对话框中,选择MATLABMexHost
过程,然后单击附加.
Visual Studio加载数据,然后显示一个空的代码窗格。
单击打开C ++ MEX源文件文件>开放>文件并选择文件。
通过右键单击所需的代码和单击,设置断点断点>插入断点在上下文菜单上。
在MATLAB中,在进程外运行c++ MEX函数matlab.mex.MexHost
函数宏指令
方法。
结果= feval(mh,“myMexFunction”input1 input2,...)
使用调试器提供的功能来调试源代码。
在Linux上®系统,您可以使用Debugger等GNU®广东发展银行
调试器。按照以下步骤使用广东发展银行
调试器。
编译您的c++ MEX源代码使用墨西哥人
命令- g
选项。此示例假定您有一个名为C ++ MEX源文件mymexfunction.cpp.
.
墨西哥人- gmymexfunction.cpp.
创建一个MEX主机进程并返回MexHost
目的。
mh = mexhost;
的进程标识符ProcessIdentifier
财产的MexHost
目的。返回值是表示MEX主机进程的标识符的字符串。例如,
mh.ProcessIdentifier
ans =“13892”
对于创建的每个进程,进程标识符是不同的。
从Linux终端将调试器附加到MEX主机进程。例如,使用GNU广东发展银行
调试器,叫广东发展银行
使用c++ MEX文件名和进程标识符,这是从MATLAB中的MEX主机对象获得的:
gdb mymexfunction -pid = 13892
在C ++ MEX功能中设置断点。例如,使用广东发展银行
,设置断点mymexfunction.cpp.
在第21行:
打破mymexfunction.cpp:21
从MATLAB,使用C ++ MEX功能使用matlab.mex.MexHost
函数宏指令
方法。
结果= feval(mh,“myMexFunction”input1 input2,...)
MATLAB等待调试器的响应。
在Linux终端上,使用调试器提供的特性来调试源代码。
在麦金塔电脑系统,使用LLDB调试器。
编译您的c++ MEX源代码使用墨西哥人
命令- g
选项。此示例假定您有一个名为C ++ MEX源文件mymexfunction.cpp.
.
墨西哥人- gmymexfunction.cpp.
创建一个MEX主机进程并返回MexHost
目的。
mh = mexhost;
的进程标识符ProcessIdentifier
财产的MexHost
目的。返回值是表示MEX主机进程的标识符的字符串。
mh.ProcessIdentifier
ans =“13892”
对于创建的每个进程,进程标识符是不同的。
控件将调试器附加到MEX主机进程苹果系统终端。调用lldb
使用您从MATLAB中的MEX主机对象获取的MEX主机进程标识符。例如,假设进程标识符是13892
,将LLDB调试器附加到此过程:
lldb - p 13892
在源代码中设置断点。例如,该命令在mymexfunction.cpp.
在第21行。
断点设置-f myMexFunction.cpp
从MATLAB,使用C ++ MEX功能使用matlab.mex.MexHost
函数宏指令
方法。
结果=函数宏指令(mh 'myMexFunction input1 input2,...)
MATLAB等待调试器的响应。
输入C
或继续
从苹果系统终端。程序执行停止在断点。
从苹果系统终端,使用调试器提供的特性来调试您的源代码。