主要内容

避免在MEX函数中复制数组

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

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

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

输入数组未修改

这个MEX函数对输入数组的元素求和,但不修改数组。分配输入[0]到一个常量matlab::数据::TypedArray <二>变量允许您使用基于范围的循环求和元素。指定数组为常量保证了变量inArray保持与输入数组共享。

#include "mexAdapter.hpp" using namespace matlab::data;使用matlab::墨西哥人:ArgumentList;class MexFunction: public matlab::mex::Function {ArrayFactory factory;public: void operator()(ArgumentList输出,ArgumentList输入){double sm = 0;const TypedArray inArray = input [0];for (auto& elem: inArray) {sm += elem;} output [0] = factory.createScalar(sm);}};

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

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

输入数组修改

这个MEX函数将输入数组中的负数替换为零。此操作将修改输入数组,使输入不能与修改后的数组共享。在验证输入数组之后,函数不使用输入[0]一次。因此,验证输入[0]数组被移动到matlab::数据::TypedArray <二>变量可以使用基于范围的循环来修改数组元素。

若要防止输入数组的复制,请移动输入[0]到一个matlab::数据::TypedArray <二>使用std::移动(),它将与输入数组关联的内存交换给变量largeArray

#include "mexAdapter.hpp" using namespace matlab::data;使用matlab::墨西哥人:ArgumentList;class MexFunction: public matlab::mex::Function {public: void operator()(ArgumentList输出,ArgumentList输入){checkArguments(输入);TypedArray largeArray = std::move(input[0]); / /输入[0]for (auto& elem: largeArray) {if (elem < 0) {elem = 0;}}输出[0]= largeArray;} void checkArguments(ArgumentList输入){std::shared_ptr matlabPtr = getEngine();ArrayFactory工厂;if (inputs[0]. gettype () != ArrayType::DOUBLE || inputs[0]. gettype () == ArrayType::COMPLEX_DOUBLE) {matlabPtr->feval(u"error", 0, std::vector({factory. gettype ()});createScalar(“输入错误”)}));}}};

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

墨西哥人removeNegativeNumbers.cpp

从MATLAB函数中调用这个MEX函数。将修改后的数组重新分配给相同的变量。

函数array = removeNegativeNumbers(array); / /删除数组...结束

例如,调用processArray函数带有MATLAB返回的一个大数组randn函数。

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

相关的话题