MATLAB Language Ingrese una cadena, modifíquela en C y envíela


Ejemplo

En este ejemplo, ilustramos la manipulación de cadenas en MATLAB MEX. Crearemos una función MEX que acepte una cadena como entrada de MATLAB, copiaremos los datos en la cadena C, la modificaremos y la convertiremos de nuevo a mxArray devuelta al lado de MATLAB.

El objetivo principal de este ejemplo es mostrar cómo se pueden convertir las cadenas a C / C ++ desde MATLAB y viceversa.

stringIO.cpp

#include "mex.h"
#include <cstring>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    // check number of arguments
    if (nrhs != 1 || nlhs > 1) {
        mexErrMsgIdAndTxt("StringIO:WrongNumArgs", "Wrong number of arguments.");
    }

    // check if input is a string
    if (mxIsChar(prhs[0])) {
        mexErrMsgIdAndTxt("StringIO:TypeError", "Input is not a string");
    }

    // copy characters data from mxArray to a C-style string (null-terminated)
    char *str = mxArrayToString(prhs[0]);

    // manipulate the string in some way
    if (strcmp("theOneString", str) == 0) {
        str[0] = 'T';  // capitalize first letter
    } else {
        str[0] = ' ';  // do something else?
    }

    // return the new modified string
    plhs[0] = mxCreateString(str);

    // free allocated memory
    mxFree(str);
}

Las funciones relevantes en este ejemplo son:

  • mxIsChar para probar si un mxArray es de tipo mxCHAR .
  • mxArrayToString para copiar los datos de una cadena mxArray a un char * buffer.
  • mxCreateString para crear una cadena mxArray partir de un char* .

Como nota al margen, si solo desea leer la cadena y no modificarla, recuerde declararla como const char* por su velocidad y robustez.


Finalmente, una vez compilados lo podemos llamar desde MATLAB como:

>> mex stringIO.cpp

>> strOut = stringIO('theOneString')
strOut = 
TheOneString

>> strOut = stringIO('somethingelse')
strOut=
omethingelse