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.

Manipulación de entradas y salidas

La API de MEX de C++ proporciona características que le permiten tener acceso a argumentos y validarlos. Ambos y definir las funciones que son útiles para realizar comprobaciones en los argumentos pasados a la función MEX.matlab::mex::ArgumentListmatlab::data::Array La clase de enumeración le permite probar tipos específicos de entradas.matlab::data::ArrayType

Validación de argumentos

Esta tabla muestra las funciones útiles para la comprobación de errores.

matlab::mex::ArgumentList::size()Determine el número de entradas. El tamaño de la matriz es igual al número de argumentos usados en la llamada de función.ArgumentList
matlab::mex::ArgumentList::empty()Prueba sin entradas o salidas. Si se llama a la función MEX sin argumentos de entrada o salida, el argumento respectivo está vacío.ArgumentList
matlab::data::Array::getType()Determine el tipo de un argumento de entrada. Esta función devuelve un objeto.matlab::data::ArrayType
matlab::data::Array::getDimensions()Determine las dimensiones de una matriz de argumentos de entrada. Esta función devuelve un objeto, que se define como.matlab::data::ArrayDimensionsstd::vector<size_t>
matlab::data::Array::getNumberOfElements()Determine el número de elementos de una matriz de argumentos de entrada.
matlab::data::Array::isEmpty()Determine si una matriz de argumentos de entrada está vacía.

Estos ejemplos muestran cómo probar los valores de argumento en el archivo MEX y producir errores cuando las pruebas fallan.MATLAB® Utilice la función para llamar a las funciones o.matlab::engine::MATLABEngine::fevalMATLABerrorwarning

Llame con estos argumentos:feval

  • El nombre de la función o, pasado como una cadena UTF16.errorwarning

  • El número de argumentos devueltos, que es cero en estos ejemplos.

  • Los mensajes que se mostrarán con las funciones o.MATLABerrorwarning Pase el mensaje en un contenedor que contenga el creado utilizando la fábrica.std::vectormatlab::data::Arraymatlab::data::ArrayFactory

Para llamar y definir los argumentos, obtenga un puntero a un motor y un generador de matrices de datos.fevalMATLABMATLAB

class MexFunction : public matlab::mex::Function { public:     void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {         std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();         matlab::data::ArrayFactory factory;         ...     } }

El archivo MEX requiere tres argumentos de entrada.

if (inputs.size() != 3) {     matlabPtr->feval(u"error", 0,         std::vector<matlab::data::Array>({ factory.createScalar("Three inputs required") })); }

MEX archivo requiere la asignación de dos argumentos de salida.

if (outputs.size() != 2) {     matlabPtr->feval(u"error", 0,          std::vector<matlab::data::Array>({ factory.createScalar("Two outputs required") })); }

El segundo argumento de entrada debe ser un vector de fila de 1 por 4 de dobles no complejos.

if (inputs[1].getType() != matlab::data::ArrayType::DOUBLE ||     inputs[1].getType() == matlab::data::ArrayType::COMPLEX_DOUBLE ||     inputs[1].getNumberOfElements() != 4 ||      inputs[1].getDimensions()[1] == 1) {     matlabPtr->feval(u"error", 0,         std::vector<matlab::data::Array>({ factory.createScalar("Input must be 4-element row vector")})); }

ArgumentList iteradores

El contenedor implementa un par de iteradores que marcan el principio y el final de la lista de argumentos.matlab::mex::ArgumentList Utilice estos iteradores para recorrer todas las entradas en una función MEX. Por ejemplo, esta función MEX suma todas sus entradas usando un loop basado en el rango.for

#include "mex.hpp" #include "mexAdapter.hpp"  class MexFunction : public matlab::mex::Function {     matlab::data::ArrayFactory factory; public:     void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {         double sm = 0;         for (const matlab::data::TypedArray<double>& elem : inputs) {             sm = sm + elem[0];         }         outputs[0] = factory.createScalar(sm);     }; };

Guarde este archivo MEX como y compile con el comando.sumInputs.cppmex Llame a la función con un intervalo de argumentos.

mex sumInputs.cpp sumInputs(1,2,3,4,5,6,7)  ans =      28

Soporte de número variable de argumentos

Puede admitir el número variable de argumentos en funciones MEX comprobando el tamaño de la matriz de entrada y salida.matlab::mex::ArgumentList

En el siguiente fragmento de código, el tamaño de la matriz de parámetros indica cuántas salidas se especifican cuando se llama a la función MEX.outputs Mediante la función, este código determina cuántas salidas se especifican cuando se llama a la función MEX.ArgumentList::size

void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) {

    if (outputs.size() == 3) {
        outputs[0] = // Assign first output
        outputs[1] = // Assign second output
        outputs[2] = // Assign thrid output
    }
    else if (outputs.size() == 1) {
        outputs[0] = // Assign only one output
    }
    else {
        matlabPtr->feval(u"error", 0, 
            std::vector<matlab::data::Array>({ factory.createScalar("One or three outputs required")}));
    }
}

Consulte también

Temas relacionados