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.

Especifique argumentos de tamaño variable para la generación de código

En este ejemplo se muestra cómo especificar argumentos de entrada de tamaño variable cuando se genera código para las funciones de objeto de los objetos de modelo de clasificación y regresión. Los datos de tamaño variable son datos cuyo tamaño puede cambiar en tiempo de ejecución. Especificar argumentos de entrada de tamaño variable es conveniente cuando tiene datos con un tamaño desconocido en tiempo de compilación. En este ejemplo también se describe cómo incluir argumentos de par nombre-valor en una función de punto de entrada y cómo especificarlos al generar código.

Para obtener ejemplos de flujo de trabajo de generación de código más detallados, vea y.Generación de código para la predicción del modelo de aprendizaje automático en la línea de comandosGeneración de código para predicción del modelo de aprendizaje automático utilizando MATLAB Coder App

Modelo de clasificación de trenes

Cargue el conjunto de datos de iris de Fisher. Convierta las etiquetas en una matriz de caracteres.

load fisheriris species = char(species);

Entrenar un árbol de clasificación utilizando todo el conjunto de datos.

Mdl = fitctree(meas,species);

es un modelo.MdlClassificationTree

Guardar modelo mediantesaveCompactModel

Guarde el árbol de clasificación entrenado en un archivo con el nombre de la carpeta actual mediante.ClassTreeIris.matsaveCompactModel

MdlName = 'ClassTreeIris'; saveCompactModel(Mdl,MdlName);

Definir función de punto de entrada

En la carpeta actual, defina una función de punto de entrada denominada que haga lo siguiente:mypredictTree.m

  • Acepte mediciones con columnas correspondientes a y acepte argumentos de par nombre-valor válidos.meas

  • Cargue un árbol de clasificación entrenado mediante.loadCompactModel

  • Predecir las etiquetas y las puntuaciones correspondientes, los números de nodo y los números de clase del árbol de clasificación cargado.

Puede permitir argumentos opcionales de par nombre-valor especificando como un argumento de entrada.varargin Para obtener más información, consulte.Code Generation for Variable Length Argument Lists (MATLAB Coder)

type mypredictTree.m  % Display contents of mypredictTree.m file
function [label,score,node,cnum] = mypredictTree(x,savedmdl,varargin) %#codegen %MYPREDICTTREE Predict iris species using classification tree %   MYPREDICTTREE predicts iris species for the n observations in the %   n-by-4 matrix x using the classification tree stored in the MAT-file %   whose name is in savedmdl, and then returns the predictions in the %   array label. Each row of x contains the lengths and widths of the petal %   and sepal of an iris (see the fisheriris data set). For other output %   argument descriptions, see the predict reference page. CompactMdl = loadCompactModel(savedmdl); [label,score,node,cnum] = predict(CompactMdl,x,varargin{:}); end 

Si pulsa el botón situado en la sección superior derecha de esta página y abre este ejemplo en MATLAB®, MATLAB® abre la carpeta de ejemplo.Note: Esta carpeta incluye el archivo de función de punto de entrada.

Generar código

Specify Variable-Size Arguments

Dado que C y C++ son lenguajes con tipos estáticos, debe determinar las propiedades de todas las variables en una función de punto de entrada en tiempo de compilación con la opción de.-argscodegen

Se usa para especificar una entrada de constante de tiempo de compilación.coder.Constant

coder.Constant(v) 

crea una variable de tipo cuyos valores son constantes, igual que, durante la generación de código.coder.Constant(v)coder.Constantv

Se utiliza para especificar una entrada de tamaño variable.coder.typeof

coder.typeof(example_value, size_vector, variable_dims) 

Los valores de, y especifican las propiedades de la matriz de entrada que el código generado puede aceptar.example_valuesize_vectorvariable_dims

  • Una matriz de entrada tiene el mismo tipo de datos que los valores de ejemplo en.example_value

  • es el tamaño de la matriz de una matriz de entrada si el valor correspondiente es.size_vectorvariable_dimsfalse

  • es el límite superior del tamaño de la matriz si el valor correspondiente es.size_vectorvariable_dimstrue

  • Especifica si cada dimensión de la matriz tiene un tamaño de variable o un tamaño fijo.variable_dims Un valor de (lógico 1) significa que la dimensión correspondiente tiene un tamaño variable; un valor de (lógico 0) significa que la cota correspondiente tiene un tamaño fijo.truefalse

La función de punto de entrada acepta Datos predictores, el nombre de archivo MAT que contiene el objeto de modelo entrenado y argumentos de par nombre-valor opcionales.mypredictTree Supongamos que desea generar código que acepte una matriz de tamaño variable para los Datos predictores y el argumento de par nombre-valor con un vector de tamaño variable para su valor.'Subtrees' A continuación, tiene cuatro argumentos de entrada: Datos predictores, el nombre de archivo MAT y el nombre y el valor del argumento de par nombre-valor.'Subtrees'

Defina una matriz de celdas de 4 por 1 y asigne cada tipo de argumento de entrada de la función de punto de entrada a cada celda.

ARGS = cell(4,1);

Para la primera entrada, utilice para especificar que la variable de Datos predictores es de doble precisión con el mismo número de columnas que los Datos predictores utilizados en el entrenamiento del modelo, pero que el número de observaciones (filas) es arbitrario.coder.typeof

p = numel(Mdl.PredictorNames); ARGS{1} = coder.typeof(0,[Inf,p],[1,0]);

para el valor implica que el tipo de datos es porque es el tipo de datos numérico predeterminado de MATLAB. para el valor y para el valor implican que el tamaño de la primera dimensión es variable y sin delimitar, y el tamaño de la segunda dimensión se fija para ser.0example_valuedoubledouble[Inf,p]size_vector[1,0]variable_dimsp

La segunda entrada es el nombre del archivo MAT, que debe ser una constante de tiempo de compilación. Se utiliza para especificar el tipo de la segunda entrada.coder.Constant

ARGS{2} = coder.Constant(MdlName);

Las dos últimas entradas son el nombre y el valor del argumento de par nombre-valor.'Subtrees' Los nombres de los argumentos de par nombre-valor deben ser constantes de tiempo de compilación.

ARGS{3} = coder.Constant('Subtrees');

Se usa para especificar que el valor de es un vector de fila de doble precisión y que el límite superior del tamaño de vector de fila es.coder.typeof'Subtrees'max(Mdl.PrunedList)

m = max(Mdl.PruneList); ARGS{4} = coder.typeof(0,[1,m],[0,1]);

De nuevo, para el valor implica que el tipo de datos es porque es el tipo de datos numérico predeterminado de MATLAB. para el valor y para el valor implican que el tamaño de la primera dimensión se fija para ser, y el tamaño de la segunda dimensión es variable y su límite superior es.0example_valuedoubledouble[1,m]size_vector[0,1]variable_dims1m

Generate Code Using codegen

Genere una función MEX desde la función de punto de entrada utilizando la matriz de celdas, que incluye los tipos de argumento de entrada para.mypredictTreeARGSmypredictTree Especifique los tipos de argumento de entrada mediante la opción.-args Especifique el número de argumentos de salida en la función de punto de entrada generada mediante la opción.-nargout El código de generación incluye el número especificado de argumentos de salida en el orden en que se producen en la definición de la función de punto de entrada.

codegen mypredictTree -args ARGS -nargout 2
 

genera la función MEX con una extensión dependiente de la plataforma en su carpeta actual.codegenmypredictTree_mex

La función acepta valores de precisión simple, valores de precisión doble y para el argumento de par nombre-valor.Predecir'all''SubTrees' Sin embargo, solo puede especificar valores de precisión doble cuando utilice la función MEX para la predicción porque el tipo de datos especificado por es Double.ARGS{4}

Compruebe que el código generado

Predecir etiquetas para una selección aleatoria de 15 valores de los datos de entrenamiento utilizando la función MEX generada y el subárbol en el nivel de poda 1. Compare las etiquetas de la función MEX con las previstas por.Predecir

rng('default'); % For reproducibility Xnew = datasample(meas,15); [labelMEX,scoreMEX] = mypredictTree_mex(Xnew,MdlName,'Subtrees',1); [labelPREDICT,scorePREDICT] = predict(Mdl,Xnew,'Subtrees',1); labelPREDICT
labelPREDICT = 15x10 char array
    'virginica '
    'virginica '
    'setosa    '
    'virginica '
    'versicolor'
    'setosa    '
    'setosa    '
    'versicolor'
    'virginica '
    'virginica '
    'setosa    '
    'virginica '
    'virginica '
    'versicolor'
    'virginica '

labelMEX
labelMEX = 15x1 cell array
    {'virginica' }
    {'virginica' }
    {'setosa'    }
    {'virginica' }
    {'versicolor'}
    {'setosa'    }
    {'setosa'    }
    {'versicolor'}
    {'virginica' }
    {'virginica' }
    {'setosa'    }
    {'virginica' }
    {'virginica' }
    {'versicolor'}
    {'virginica' }

Las etiquetas previstas son las mismas que las etiquetas de función MEX excepto el tipo de datos. Cuando el tipo de datos de respuesta es y no puede determinar que el valor de es un escalar, a continuación, la salida del código generado es una matriz de vectores de caracteres de celda.charcodegenSubtrees

Para la comparación, puede convertir a una matriz de celdas y usarla.labelsPREDICTisequal

cell_labelPREDICT = cellstr(labelPREDICT); verifyLabel = isequal(labelMEX,cell_labelPREDICT)
verifyLabel = logical
   1

Devuelve Logical 1 (), lo que significa que todas las entradas son iguales.isequaltrue

Compare las segundas salidas también. puede incluir diferencias de redondeo en comparación con.scoreMexscorePREDICT En este caso, compare y, permitiendo una pequeña tolerancia.scoreMEXscorePREDICT

find(abs(scorePREDICT-scoreMEX) > 1e-8)
ans =    0x1 empty double column vector 

Devuelve un vector vacío si la diferencia absoluta de elemento-sabio entre y no es mayor que la tolerancia especificada.findscorePREDICTscoreMEX1e-8 La comparación confirma que y son iguales dentro de la tolerancia.scorePREDICTscoreMEX1e–8

Consulte también

| | | | |

Temas relacionados