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.

Opere en matrices de C++ mediante el patrón de visitante

La API de datos de C++ admite el uso de clases de visitante a través de las funciones y.MATLAB®matlab::data::apply_visitormatlab::data::apply_visitor_ref Estas funciones aceptan una referencia de matriz o matriz y una clase de visitante como entradas.

El y las funciones de envío a las operaciones definidas por la clase de visitante en función del tipo de matriz de entrada.apply_visitorapply_visitor_ref La clase de visitante define operaciones para realizar en tipos específicos de matriz.

Utilice el patrón de visitante en casos como estos:

  • Hay muchas operaciones que necesita realizar en una matriz y la forma de realizarlas depende del tipo de la matriz.

  • La matriz devuelta por una función puede ser de diferentes tipos conocidos y desea controlar todos los casos.

  • Está trabajando con estructuras heterogéneas como matrices de celdas o matrices de estructura.

Dispatch en array o array Reference

La función distribuye a la operación de clase de visitante en función del tipo de la matriz de entrada.apply_visitor La sintaxis para llamar acepta a y su instancia de clase de visitante:apply_visitormatlab::data::Array

auto apply_visitor(matlab::data::Array a, V visitor)

La función distribuye a la operación de clase de visitante en función del tipo de la referencia de matriz pasada como entrada.apply_visitor_ref La sintaxis para llamar acepta a y su instancia de clase de visitante:apply_visitor_refmatlab::data::ArrayRef

auto apply_visitor_ref(const matlab::data::ArrayRef& a, V visitor)

Sobrecargaoperator()

Implemente la clase de visitante para sobrecargar el operador para los tipos de matriz en los que desea operar.operator() Por ejemplo, supongamos que una operación que desea implementar es devolver el texto contenido en un como un.matlab::data::CharArraystd::string Implemente la operación así:

std::string operator()(matlab::data::CharArray arr){    return arr.toAscii(); }

Como otro ejemplo, supongamos que desea anular los valores lógicos de un.matlab::data::TypedArray En este caso, utilice una referencia a la matriz:

void operator()(TypedArrayRef<bool> boolArrRef) {     std::cout << "Negate logical value: " << std::endl;     for (auto &b : boolArrRef) {         b = !b;     }        }

Debe usar una referencia de elemento en el bucle basado en intervalo para cambiar el valor de la matriz.for

Visitor Class to Display Contents of Cell Array

En este ejemplo se muestra cómo usar una clase de visitante para definir operaciones para realizar en tipos específicos de.matlab::data::Array

La clase implementa las operaciones para mostrar el contenido de las matrices de celdas para las matrices de tipos y las matrices de celdas contenidas.DisplayVisitorbooldoublechar Puede agregar nuevas operaciones para admitir otros contenidos de matriz de celdas agregando más funciones sobrecargadas.

type DisplayVisitor.cpp
#include "MatlabDataArray.hpp" #include <iostream>  using namespace matlab::data; void DisplayCell(const CellArray cellArray);      class DisplayVisitor {     public:         template <typename U>         void operator()(U arr) {}          void operator()(const TypedArray<bool> boolArr) {             std::cout << "Cell contains logical array: " << std::endl;             for (auto b : boolArr) {                 printf_s("%d ", b);             }             std::cout << "\n";         }          void operator()(const TypedArray<double> doubleArr) {             std::cout << "Cell contains double array: " << std::endl;             for (auto elem : doubleArr) {                 std::cout << elem << " ";             }             std::cout << "\n";         }          void operator()(const CharArray charArr) {             std::cout << "Cell contains char array: " << std::endl;             for (auto elem : charArr) {                 std::cout << char(elem);             }             std::cout << "\n";         }          void operator()(const CellArray containedCellArray) {             DisplayCell(containedCellArray);         }     };      void DisplayCell(const CellArray cellArray) {         DisplayVisitor v;         for (auto elem : cellArray) {             apply_visitor(elem, v);         }     } 

Para usar la clase, pase una matriz de celdas a la función.DisplayCell

type callDisplayCell.cpp
int main() {     ArrayFactory factory;      // Create cell array     matlab::data::CellArray cellArray = factory.createCellArray({ 1,4 },         factory.createCharArray("A char array"),         factory.createArray<bool>({ 1,2 }, { false, true }),         factory.createArray<double>({ 2,2 }, { 1.2, 2.2, 3.2, 4.2 }),         factory.createCellArray({ 1,1 }, false));      // Call function      DisplayCell(cellArray);      return 0; } 

Visitor Class to Modify Contents of Cell Array

En este ejemplo, la clase implementa las operaciones para modificar el contenido de las matrices de celdas de tipos y las matrices de celdas contenidas.CellModifyVisitorbooldoublechar Puede agregar nuevas operaciones para admitir otros contenidos de matriz de celdas agregando más funciones sobrecargadas.

La función llama en un bucle para cada elemento de la matriz de celdas.ModifyCellapply_visitor_ref Dado que el objetivo es modificar el contenido de la matriz de celdas, en este ejemplo se usan referencias al contenido de la matriz de celdas.

type CellModifyVisitor.cpp
#include "MatlabDataArray.hpp" #include "MatlabEngine.hpp" #include <iostream>  using namespace matlab::data; void ModifyCell(CellArray &cellArray);  class CellModifyVisitor { public:     template <typename U>     void operator()(U arr) {}      void operator()(TypedArrayRef<bool> boolArrRef) {         std::cout << "Negate logical value: " << std::endl;         for (auto &b : boolArrRef) {             b = !b;         }            }      void operator()(TypedArrayRef<double> doubleArrRef) {         std::cout << "Add 1 to each value: " << std::endl;         for (auto &elem : doubleArrRef) {             elem = elem + 1;         }         std::cout << "\n";     }      void operator()(CharArrayRef charArrRef) {         std::cout << "Modify char array" << std::endl;         ArrayFactory factory;         charArrRef = factory.createCharArray("Modified char array");     }       void operator()(CellArrayRef containedCellArray) {         CellModifyVisitor v;         for (auto elem : containedCellArray) {             apply_visitor_ref(elem, v);         }     }      };  void ModifyCell(CellArray &cellArray) {     CellModifyVisitor v;     for (auto elem : cellArray) {         apply_visitor_ref(elem, v);     } } 

Para usar la clase, pase una matriz de celdas a la función.ModifyCell

type callModifyCell.cpp
int main() {     ArrayFactory factory;      // Create cell array     matlab::data::CellArray cellArray = factory.createCellArray({ 1,4 },         factory.createCharArray("A char array"),         factory.createArray<bool>({ 1,2 }, { false, true }),         factory.createArray<double>({ 2,2 }, { 1.2, 2.2, 3.2, 4.2 }),         factory.createCellArray({ 1,1 }, false));      // Call function     ModifyCell(cellArray);      return 0; } 

Consulte también

|

Temas relacionados