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.

Los objetos en funciones MEXMATLAB

Las funciones MEX pueden acceder a las propiedades del objeto utilizando las funciones miembro.MATLAB®matlab::engine::MATLABEngine::setPropertymatlab::engine::MATLABEngine::getProperty Los objetos pasados a las funciones MEX se comportan como objetos pasados a cualquier función:MATLAB

  • Controlar objetos: los cambios realizados para controlar objetos en funciones MEX afectan al objeto en el área de trabajo del llamador.

  • Objetos de valor: los cambios realizados en objetos de valor en funciones MEX solo afectan a la copia independiente del objeto en el espacio de trabajo de la función MEX.

Por lo tanto, los objetos de valor modificados en funciones MEX deben devolverse al llamador, mientras que los objetos de identificador no es necesario devolver. Para obtener más información sobre el comportamiento de los objetos, consulte.Object Modification

Obtener valor de propiedad

Para obtener un valor de propiedad, haga una copia compartida del objeto como un.matlab::data::Array Por ejemplo, suponiendo que el objeto es el primer argumento de entrada, asígnelo a una variable:

matlab::data::Array object(inputs[0]);

Cree una matriz de datos del tipo correcto para el valor de propiedad.MATLAB Por ejemplo, suponiendo que una propiedad llamada contiene un vector de caracteres, defina el nuevo valor como un.NameMATLABmatlab::data::CharArray Utilice la para crear la matriz.matlab::data::ArrayFactory

matlab::data::CharArray propName = matlabPtr->getProperty(object, u"Name");

Obtener valor de propiedad de la matriz de objetos

Si la entrada a la función MEX es una matriz de objetos, llame con el índice del objeto en la matriz cuyo valor de propiedad desea obtener.getProperty Por ejemplo, este fragmento de código devuelve el valor de la propiedad para el cuarto elemento de la matriz de objetos,.NameobjectArray

matlab::data::Array objectArray(inputs[0]); matlab::data::CharArray propName = matlabPtr->getProperty(objectArray, 3, u"Name");

Establecer valor de propiedad

Para establecer un valor de propiedad, haga una copia compartida del objeto como un.matlab::data::Array Por ejemplo, suponiendo que el objeto es el primer argumento de entrada, asígnelo a una variable.

matlab::data::Array object(inputs[0]);

Cree una matriz de datos del tipo correcto para el valor de propiedad.MATLAB Por ejemplo, suponiendo que una propiedad llamada contiene un vector de caracteres, defina el nuevo valor como un.NameMATLABmatlab::data::CharArray Utilice la para crear la matriz.matlab::data::ArrayFactory

Llame a la función del motor con el puntero compartido.MATLABsetPropertymatlabPtr

matlabPtr->setProperty(object, u"Name",     factory.createCharArray("New value for Name"));

Establecer valor de propiedad en matriz de objetos

Si la entrada a la función MEX es una matriz de objetos, llame con el índice del objeto en la matriz cuyo valor de propiedad desea establecer.setProperty Por ejemplo, este fragmento de código establece el valor de la propiedad para el cuarto elemento de la matriz de objetos,.NameobjectArray

matlab::data::Array objectArray(inputs[0]); matlabPtr->setProperty(objectArray, 3, u"Name",        factory.createCharArray("New value for Name"));

Comportamiento de copia en escritura de propiedades de objeto

Cuando una función MEX modifica una propiedad de objeto asignando un valor a la propiedad, el valor de la propiedad ya no se comparte con el objeto en el área de trabajo del llamador. Los datos de las propiedades que no se modifican permanecen compartidos. Es decir, el comportamiento de copiar en escritura afecta a la propiedad modificada, no a todo el objeto.

Modificar propiedad y devolver objeto

En este ejemplo se utiliza la clase para crear un objeto.EmployeeID Esta clase define dos propiedades. La propiedad se define como un número 1 por cualquier cantidad de elementos array de tipo.Namechar La propiedad se define como una matriz de elementos de tipo 1000-by-800 para la imagen de empleado.Pictureuint8

classdef EmployeeID    properties       Name (1,:) char       Picture (1000,800) uint8    end    methods       function obj = EmployeeID(n,p)          if nargin > 0             obj.Name = n;             obj.Picture = p;          end       end    end end

La siguiente función MEX modifica la imagen contenida en un objeto de la clase para reducir la intensidad de los valores más brillantes de la imagen.EmployeeID La función MEX realiza estos pasos:

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

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

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

        // Move objec to variable
        Array obj = std::move(inputs[0]);

        // Get property value and modify
        TypedArray<uint8_t> imageData = matlabPtr->getProperty(obj, u"Picture");
        for (auto& elem : imageData) {
            if (elem > 240) {
                elem = elem - elem/100;
            }
        }

        // Set property value and assign to output
        matlabPtr->setProperty(obj, u"Picture", imageData);
        outputs[0] = obj;
    }
};

Después de guardar este código en un archivo (llamado en este ejemplo), compilarlo con la función.reduceGlare.cppmex Llame a esta función MEX desde con un objeto como entrada.MATLABEmployeeID

EmployeeObject = EmployeeID('My Name',randi([1 255],1000,800,'uint8')); EmployeeObject = reduceGlare(EmployeeObject);

Sólo propiedad modificada hace que la copia

En este ejemplo se crea una función MEX que acepta un objeto y un nuevo valor para su propiedad como sus entradas.EmployeeIDName Después de establecer la propiedad en el nuevo valor, la función devuelve el objeto modificado. Esta función MEX realiza algunos pasos adicionales que pueden ser útiles en su programa.

  • La comprobación de argumentos confirma el número correcto de entradas y llama a determinar la clase del objeto de entrada.MATLABisa

  • Compatibilidad con o entrada de valor para establecer la propiedad.charstringName

  • Comparación del valor de propiedad actual para determinar si es necesario realizar la actualización.

Para ver el código fuente, haga clic en modifyObjectProperty.cpp Y EmployeeID.m para abrir los archivos en el editor.MATLAB Utilice el comando para construir la función MEX.mex

Para ejecutar este ejemplo, agregue el archivo y la clase a una carpeta de la ruta de acceso.modifyObjectProperty.cppEmployeeID.mMATLAB Después de realizar la configuración, ejecute estas sentencias:mex

mex modifyObjectProperty.cpp EmployeeObject = EmployeeID('My Name',randi([1 255],1000,800,'uint8')); EmployeeObject = modifyObjectProperty(EmployeeObject,'New Name');

Aquí está la implementación.MexFunction::operator()

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

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

class MexFunction : public matlab::mex::Function {
public:
    void operator()(ArgumentList outputs, ArgumentList inputs) {
        // Check for correct inputs
        checkArguments(outputs, inputs);

        // Assign the input object to a matlab::data::Array
        Array object(inputs[0]);

        // Member function to set properyt value
        assignProperty(object, inputs);

        // Return modified object
        outputs[0] = object;
    }

La función realiza estas comprobaciones:MexFunction::checkArguments

  • La función MEX debe llamarse con dos argumentos.

  • El primer argumento debe ser un objeto de la clase.EmployeeID

    void checkArguments(ArgumentList out, ArgumentList in) {
        std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
        ArrayFactory factory;

        // Check number of inputs
        if (in.size() != 2) {
            matlabPtr->feval(u"error", 0,
                std::vector<Array>({ factory.createScalar("Two inputs required") }));
        }
        // Use isa function to test for correct class
        std::vector<Array> args{ in[0], factory.createCharArray("EmployeeID") };
        TypedArray<bool> result = matlabPtr->feval(u"isa", args);
        if (result[0] != true) {
            matlabPtr->feval(u"error", 0, 
               std::vector<Array>({ factory.createScalar("Input must be an EmployeeID object") }));
        }     
    }

La función determina si el nuevo valor de la propiedad se pasa como un vector o como un y asigna la entrada definida como a o a respectivamente.MexFunction::assignPropertyMATLABcharstringmatlab::data::CharArraymatlab::data::StringArray

Antes de asignar el nuevo valor a la propiedad, esta función compara el valor actual para determinar si es diferente y evita realizar una asignación si no lo está.Name

    void assignProperty(Array& obj, ArgumentList in) {
        std::shared_ptr<matlab::engine::MATLABEngine> matlabPtr = getEngine();
        ArrayFactory factory;
        std::string newPropertyValue;

        // Determine if input is MATLAB char or MATLAB string
        if (in[1].getType() == ArrayType::CHAR) {
            CharArray newName(in[1]);
            newPropertyValue = newName.toAscii();
        }
        else if (in[1].getType() == ArrayType::MATLAB_STRING) {
            StringArray newName(in[1]);
            newPropertyValue = (std::string)newName[0];
        }
        else {
            matlabPtr->feval(u"error", 0,
                std::vector<Array>({ factory.createScalar("Name must be a char or string") }));
        }

        // If new value is different from new value, set new value
        CharArray currentName = matlabPtr->getProperty(obj, u"Name");
        if (currentName.toAscii() != newPropertyValue) {
            matlabPtr->setProperty(obj, u"Name", factory.createCharArray(newPropertyValue));
        }
    }

Controlar objetos

Para obtener un ejemplo que usa un objeto Handle, descargue el siguiente archivo y siga las instrucciones del archivo para compilar y ejecutar la función MEX.

mexgetproperty.cpp

Consulte también

|

Temas relacionados