I want to use the mex c++ api to interface existing external code. The API of the external application is fairly low level, but I cannot work out how I can access the double pointers I'd like to pass. As this is not specific to the code I have, assume I have a function
void foo(int n, const double *a, const double *b, double *c)
to which I pass the arrays a and b and their lengths n and it calculates something and puts it onto the array c.
In order to use the mex function with the c++ api I don't know how I can avoid copying the data into some dummy pod arrays along the lines of:
#include "mex.hpp"#include "mexAdapter.hpp"using namespace matlab::data;using matlab::mex::ArgumentList;class MexFunction : public matlab::mex::Function{private: ArrayFactory factory; std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr; void validateArguments(ArgumentList outputs, ArgumentList inputs) { if (inputs.size() != 2) matlabPtr->feval(u"error", 0, std::vector<Array>({ factory.createScalar("Require 2 inputs")})); if (inputs[0].getType() != ArrayType::DOUBLE || inputs[0].getType() == ArrayType::COMPLEX_DOUBLE ) matlabPtr->feval(u"error", 0, std::vector<Array>({ factory.createScalar("First input has to be a double array") } )); if (inputs[1].getType() != ArrayType::DOUBLE || inputs[1].getType() == ArrayType::COMPLEX_DOUBLE ) matlabPtr->feval(u"error", 0, std::vector<Array>( {factory.createScalar("second input has to be a double array")})); if (outputs.size() > 1) matlabPtr->feval(u"error", 0, std::vector<Array>( {factory.createScalar("One output only")})); } void foo(int n, const double *a, const double *b, double *c){ int i; for (i=0;i<n;i++) c[i] = a[i] + b[i]; }public: MexFunction() : matlabPtr(getEngine()) {} ~MexFunction() {} void operator() (ArgumentList outputs, ArgumentList inputs) { validateArguments(outputs,inputs); double *retVal, *a, *b; int i, n = inputs[0].getNumberOfElements(); retVal = new double[n]; a = new double[n]; b = new double[n]; for (i =0; i<n;i++){ a[i] = inputs[0][i]; b[i] = inputs[1][i]; } foo(n, a, b, retVal); ArrayDimensions dims = inputs[0].getDimensions(); outputs[0] = factory.createArray(dims, retVal, retVal+n); delete a; delete b; delete retVal; }};
This copying and creating of placeholders seems unelegant and wasteful. What am I missing? Please help!
Thank you!
Manuel
Best Answer