MEX函数可以访问MATLAB®使用该属性Matlab :: Engine :: Matlabengine :: SetProperty和Matlab :: Engine :: Matlabengine :: GetProperty会员职能。传递给MEX函数的对象行为像传递给任何MATLAB功能的对象:
处理对象 - 对MEX函数中处理对象的更改会影响来电者工作区中的对象。
值对象 - 对MEX函数中的值对象所做的更改仅影响MEX函数的工作空间中对象的独立副本。
因此,在MEX函数中修改的值对象必须返回给调用者,而句柄对象不需要返回。有关对象行为的更多信息,请参见对象修改。
要获取属性值,请将对象的共享副本作为matlab :: data :: Array
。例如,假设对象是第一个输入参数,将其分配给变量:
matlab :: data :: Array对象(输入[0]);
为属性值创建正确类型的MATLAB数据数组。例如,假设一个名为的属性名称
包含一个MATLAB字符向量,将新值定义为aMatlab :: data :: chararray
。使用matlab :: data :: ArrayFactory
创建数组。
matlab :: data :: chararray propname = matlabptr-> getProperty(对象,U“名称”);
如果MEX函数的输入是对象数组,请致电getProperty
在阵列中的对象索引,您想要获得的属性值。例如,此代码段返回值的值名称
对象数组中的第四个元素的属性,对象array.
。
matlab :: data :: Array objectArray(输入[0]);matlab :: data :: chararray propname = matlabptr-> getProperty(Objectarray,3,U“名称”);
要设置属性值,请使对象的共享副本作为matlab :: data :: Array
。例如,假设对象是第一个输入参数,将其分配给变量。
matlab :: data :: Array对象(输入[0]);
为属性值创建正确类型的MATLAB数据数组。例如,假设一个名为的属性名称
包含一个MATLAB字符向量,将新值定义为aMatlab :: data :: chararray
。使用matlab :: data :: ArrayFactory
创建数组。
打电话给Matlab引擎setProperty.
函数与matlabptr.
共享指针。
matlabptr-> setProperty(对象,U“名称”,factory.createCharArray(“名称新值”));
如果MEX函数的输入是对象数组,请致电setProperty.
使用要设置的属性值的数组中对象的索引。例如,此代码片段设置值名称
对象数组中的第四个元素的属性,对象array.
。
matlab :: data :: Array objectArray(输入[0]);matlabptr-> setProperty(ObjectArray,3,U“名称”,factory.createCharArray(“名称新值”));
当MEX函数通过为属性分配值修改对象属性时,属性值不再与调用者工作区中的对象共享。未修改的属性中的数据保持共享。也就是说,写入编写行为会影响修改后的属性,而不是整个对象。
这个例子使用了员工ID
class创建一个对象。此类定义了两个属性。这名称
属性被定义为一个类型的类型的类型数组char
。这图片
属性定义为1000×800元素数组uint8.
对于员工图像。
Classdef.员工ID属性名称(1,:) char图片(1000,800)UINT8结尾方法功能obj = employeeid(n,p)如果nargin> 0 obj.name = n;obj.picture = p;结尾结尾结尾结尾
以下MEX功能修改了包含在object中的图像员工ID
类以降低图像中最亮值的强度。MEX函数执行以下步骤:
将输入参数移动到amatlab :: data :: Array
使用std::移动
。
用途Matlab :: Engine :: Matlabengine :: GetProperty
获取属性的值要修改。
将变量定义为适合属性值的类型。采用matlab :: data :: typedarray
因为matlab类型是uint8.
。
将修改的数组重新分配给Object属性Matlab :: Engine :: Matlabengine :: SetProperty
。
将修改后的对象返回为MEX功能输出。
#include“mex.hpp”#include“mexadapter.hpp”使用matlab :: mex :: ArgumentList;使用命名空间matlab :: data;class mexfunction:public matlab :: mex :: function {std :: shared_ptrmatlabptr = getengine();公共:void运算符()(ArgumentList输出,ArgumentList输入){//将对象移动到变量array obj = std :: move(输入[0]);//获取属性值并修改TypedArray imageData = matlabPtr->getProperty(obj, u"Picture");for (auto& elem: imageData) {if (elem > 240) {elem = elem - elem/100;}}//设置属性值并分配给输出matlabptr-> setproperty(obj,u“图片”,imagedata);输出[0] = obj;}};
在文件中保存此代码(调用reduceGlare.cpp
在这个例子中),用它编译它墨西哥人
功能。用matlab致电这个mex函数员工ID
对象作为输入。
EmployEobject = EmployeeID('我的名字',兰迪([1 255],1000,800,'uint8'));EmployeeObject = CransualLare(EmployEobject);
此示例创建了一个接受的MEX函数员工ID
对象和它的新价值名称
属性作为其投入。将属性设置为新值后,函数返回修改后的对象。此MEX函数执行一些可以在程序中有用的其他步骤。
参数检查确认正确数量的输入并调用MATLABisa.
确定输入对象的类。
金宝app支持char
或细绳
输入值设置名称
财产。
当前属性值的比较确定是否需要进行更新。
要查看源代码,请单击modifyobjectProperty.cpp.
和员工人数为..M.
在MATLAB编辑器中打开文件。使用墨西哥人
命令构建MEX功能。
要运行此示例,请添加modifyobjectProperty.cpp.
文件和文件员工人数为..M.
类到MATLAB路径中的文件夹。后执行墨西哥人
设置,执行以下语句:
墨西哥人modifyobjectProperty.cpp.EmployEobject = EmployeeID('我的名字',兰迪([1 255],1000,800,'uint8'));EmployeeObject = ModifyObjectProperty(EmployEobject,'新名字');
这里是MexFunction :: Operator()
执行。
使用matlab :: mex :: ArgumentList包含“Mex.hpp”#include“mexadapter.hpp”;使用命名空间matlab :: data;class mexfunction:public matlab :: mex :: function {public:void运算符()(ArgumentList输出,ArgumentList输入){//检查是否正确输入校验库(输出,输入);//将输入对象分配给matlab :: data :: Array数组对象(输入[0]);//成员函数设置Qualtyt值AssignProperty(对象,输入);//返回修改后的对象输出[0] =对象;}
这mexfunction :: checkarguments.
函数执行这些检查:
必须用两个参数调用MEX函数。
第一个参数必须是一个对象员工ID
班级。
void checkarguments(ArgumentList Out,ArgumentList in){std :: shared_ptrmatlabptr = getengine();ArrstFactory Factory;//检查输入的号码if(in.size()!= 2){matlabptr-> feval(U“错误”,0,std :: vector ({factore.createScalar(“需要”两个输入)));}//使用ISA函数来测试正确的类STD :: Vector args {在[0],factory.createcharArray(“employeeID”)};TypedArray 结果= Matlabptr-> Feval(U“ISA”,ARGS);if(结果[0]!= true){matlabptr-> feval(u“错误”,0,std :: vector ({factore.createscalar(“输入必须是employeeid对象”)});}}
这MexFunction :: AssignProperty.
函数确定属性的新值是否已作为MATLAB传递char
矢量或作为一个细绳
并将输入定义为aMatlab :: data :: chararray
或者matlab :: data :: stryarray
分别。
在为新值分配给名称
属性,此函数比较当前值来确定它是否不同,如果不是,则避免赋予分配。
void ensignproperty(array&obj,gression列表中){std :: shared_ptrmatlabptr = getengine();ArrstFactory Factory;std :: string newpropertyvalue;//确定输入是否是matlab char或matlab字符串if(在[1] .gettype()== arraytype :: char){charArray newname(在[1]中);newpropertyvalue = newname.toascii();}否则if(在[1] .gettype()== restrype :: matlab_string){stryarraray newname(在[1]中);newpropertyvalue =(std :: string)newname [0];} else {matlabptr-> feval(U“错误”,0,std :: vector ({factore.createscalar(“名称必须是char或string”)});}//如果new value与new value不同,则设置new valueCharArray CurrentName = MatlabPtr-> GetProperty(OBJ,U“名称”);if(currentname.to sccii()!= newpropertyvalue){matlabptr-> setproperty(obj,u“name”,factory.createCharArray(NewPropertyValue));}}
有关使用句柄对象的示例,请下载以下文件并按照文件中的说明进行才能构建并运行MEX函数。
Matlab :: Engine :: Matlabengine :: GetProperty|Matlab :: Engine :: Matlabengine :: SetProperty