主要内容

马铃薯MEX功能中的对象

MEX函数可以访问MATLAB®使用该属性Matlab :: Engine :: Matlabengine :: SetPropertyMatlab :: 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函数通过为属性分配值修改对象属性时,属性值不再与调用者工作区中的对象共享。未修改的属性中的数据保持共享。也就是说,写入编写行为会影响修改后的属性,而不是整个对象。

修改属性并返回对象

这个例子使用了员工IDclass创建一个对象。此类定义了两个属性。这名称属性被定义为一个类型的类型的类型数组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函数执行以下步骤:

#include“mex.hpp”#include“mexadapter.hpp”使用matlab :: mex :: ArgumentList;使用命名空间matlab :: data;class mexfunction:public matlab :: mex :: function {std :: shared_ptr  matlabptr = 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_ptr  matlabptr = 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_ptr  matlabptr = 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函数。

mexgetproperty.cpp.

也可以看看

|

相关的话题