主要内容

避免在MEX函数中复制数组

MEX函数通常可以通过控制函数复制大型数据阵列的时间来提高性能。在这些情况下,可以避免不必要的阵列复制:

  • MEX函数访问输入数组,但不修改数组的元素。

  • MEX函数修改输入数组,修改后的数组返回给调用函数。

未修改输入数组

此MEX函数对输入数组的元素求和,但不修改数组。赋值输入[0]常数matlab::data::TypedArray变量允许您使用基于范围的对于循环对元素求和。将数组指定为常数确保变量inArray与输入数组保持共享。

#包含“mex.hpp”#使用名称空间matlab::data包含“mexAdapter.hpp”;使用matlab::mex::ArgumentList;类MexFunction:public matlab::mex::Function{ArrayFactory工厂;public:void运算符()(ArgumentList输出,ArgumentList输入){double sm=0;常量TypedArrayinArray=输入[0];对于(auto&elem:inArray){sm+=elem;}输出[0]=factory.createScalar(sm);};

将此代码保存到文件(称为addArrayElements.cpp在本例中),使用墨西哥人函数。从MATLAB调用此MEX函数®使用双数组作为输入参数。

墨西哥人addArrayElements.cppb=附加组件([1:1e7]);b=5.0000e+13

修改输入数组

此MEX函数将输入数组中的负值替换为零。此操作修改输入数组,使输入不能与修改后的数组共享。验证输入数组后,函数不使用输入[0]再次。因此,验证输入[0]数组被移动到matlab::data::TypedArray变量以启用基于范围的对于循环来修改数组元素。

要防止复制输入数组,请移动输入[0]matlab::data::TypedArray使用std::move(),它将与输入数组关联的内存交换到变量拉吉雷.

#包含“mex.hpp”#使用名称空间matlab::data包含“mexAdapter.hpp”;使用matlab::mex::ArgumentList;类MexFunction:public matlab::mex::Function{public:void operator()(ArgumentList输出,ArgumentList输入){checkArguments(输入);TypedArraylargeArray=std::move(输入[0]);对于(auto&elem:largeArray){if(elem<0){elem=0;}}输出[0]=largeArray;}无效校验参数(参数列表输入){std::shared\u ptrmatlabPtr=getEngine();ArrayFactory;if(输入[0]。getType()!=ArrayType::DOUBLE |输入[0]。getType()=ArrayType::COMPLEX\u DOUBLE){matlabPtr->feval(u“错误”,0,std::vector({factory.createScalar(“输入错误”)}));};

将此代码保存到文件(称为RemovenegativeNumber.cpp在本例中),使用墨西哥人作用

mex RemovenegativeNumber.cpp

从MATLAB函数调用此MEX函数。将修改后的数组重新指定给同一变量。

作用arry=processArray(arry)arry=removeNegativeNumbers(arry);....结束

例如,调用processArrayMATLAB返回的带有大数组的函数兰登作用

A=processArray(randn(10000));min(A(:)ans=0

相关的话题