Main Content

Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Estructura de la función MEX de C++

Diseño de función MEX

Una función MEX de C++ es una clase que reemplaza el operador de llamada de función, para crear un objeto de función o functor.operator() Estos objetos se comportan como funciones que pueden aceptar entradas y devolver salidas.MATLAB®

Archivos de encabezado

Incluya estos archivos de encabezado:

  • : Incluya este archivo para la API de MEX de C++.mex.hpp

  • : Incluya este archivo una vez para la implementación de la clasemexAdapter.hppMexFunction

Nombres

Las API de MEX de C++ están contenidas en estos espacios de nombres:

  • — Interfaz MEXmatlab::mex

  • : La API de datosmatlab::dataMATLAB

  • — Engine API for C++matlab::engine

Punto de entrada

Definir una función MEX de C++ como una clase denominada que deriva de la clase.MexFunctionmatlab::mex::Function La clase reemplaza el virtual de la clase.MexFunctionoperator()matlab::mex::Function

#include "mex.hpp"
#include "mexAdapter.hpp"

class MexFunction : public matlab::mex::Function {
public:
    void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {
        // check input arguments
// implement function
        ...
    }
}

Pasar argumentos

pasa cada argumento de entrada como un en el contenedor.MATLABmatlab::data::Arraymatlab::mex::ArgumentList Acceda a cada entrada indexando la matriz.ArgumentList Por ejemplo, es la primera entrada, es la segunda, y así sucesivamente.inputs[0]inputs[1] El número de elementos de la variable es igual al número de argumentos de entrada pasados a la función MEX cuando se llama a la función. admiten iteradores y se pueden usar en bucles basados en intervalo.inputsArgumentListfor

Asigne los argumentos de salida a la variable de salida. Por ejemplo, es la primera salida asignada, es la segunda, y así sucesivamente.outputs[0]outputs[1] El número de elementos de la variable es igual al número de salidas asignadas cuando se llama a la función.outputs

A menudo resulta útil asignar argumentos de entrada a otros tipos de matrices de datos.MATLAB Tipos específicos como o proporcionan funcionalidad adicional como iteradores y funciones de convertidor.matlab::data::TypedArray<T>matlab::data::CharArray Elija el tipo que coincida con el tipo de la entrada.

Por ejemplo, la siguiente función MEX asigna la matriz de entrada a un.matlab::data::TypedArray<double> Este tipo de matriz admite el uso de un bucle basado en rango, que se utiliza para multiplicar cada elemento de la matriz por 2. La matriz modificada se devuelve en la variable.outputs

#include "mex.hpp"
#include "mexAdapter.hpp"

using namespace matlab::data;
using matlab::mex::ArgumentList;

class MexFunction : public matlab::mex::Function {
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {

        // Validate arguments
        checkArguments(outputs, inputs);

        // Implement function
        TypedArray<double> doubleArray = std::move(inputs[0]);
        for (auto& elem : doubleArray) {
            elem *= 2;
        }

        // Assign outputs
        outputs[0] = doubleArray;
    }

    void checkArguments(ArgumentList outputs, ArgumentList inputs) {
        std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
        ArrayFactory factory;
        if (inputs[0].getType() != ArrayType::DOUBLE ||
            inputs[0].getType() == ArrayType::COMPLEX_DOUBLE)
        {
            matlabPtr->feval(u"error", 0, 
                std::vector<Array>({ factory.createScalar("Input must be a double array") }));
        }

        if (outputs.size() > 1) {
            matlabPtr->feval(u"error", 0, 
                std::vector<Array>({ factory.createScalar("Only one output is returned") }));
        }
    }
};

Compile y ejecute la función MEX.

mex timesTwo.cpp timesTwo(1:10)
ans =       2     4     6     8    10    12    14    16    18    20

Para obtener más información sobre la validación de argumentos, consulte.Manipulación de entradas y salidas

Constructor de clase y destructor

Llamar a la función MEX de crea una instancia de la clase.MATLABMexFunction Por ejemplo, esta instrucción crea una instancia de la clase definida por el archivo.MATLABMexFunctionmyMEXFunction.cpp

output = myMEXFunction(input);

Esta instancia sigue existiendo hasta que se llama al comando.MATLABclearmex

Implementar un constructor de clase y un destructor proporciona una manera de realizar ciertas tareas al construir el objeto.MexFunction Por ejemplo, este fragmento de código abre un archivo de texto para leer en el constructor y cierra el archivo en el destructor.

#include "mex.hpp" #include "mexAdapter.hpp" #include <fstream>   using matlab::mex::ArgumentList;  class MexFunction : public matlab::mex::Function {     std::ifstream inFile;  public:     MexFunction() {         inFile.open("someTextFile.txt");     }      ~MexFunction() {          inFile.close();     }      void operator()(ArgumentList outputs, ArgumentList inputs) {         ....     } };

Para ver un ejemplo, vea.Gestión de recursos externos de funciones MEX

Consulte también

|

Temas relacionados