c++ c matlab matlab-deployment

c++ - Matlab Coder vs codificación de mano?



matlab-deployment (5)

Como se ha dicho anteriormente, depende de su aplicación. Traté de convertir el decodificador (de un sistema de comunicación), da los resultados precisos, pero para una gran cantidad de bits es más lento que su propia versión de MATLAB. Así que mi conclusión fue convertir el código de MATLAB en C a mano.

Algunos antecedentes para las personas que lean esto en el futuro (en caso de que no esté bloqueado). Tiendo a hacer mi programación en un lenguaje de alto nivel para entender el problema primero. Después de cubrir todos los casos de esquina posibles, procedo a traducir el código a C ++ (o C).

La mayor parte del código que escribo tiene matemática, por lo que MATLAB es el lenguaje que uso (la alternativa para mí es Python). De todos modos, luego traduzco el código de MATLAB a C ++ a mano.

¿Alguien sabe si hay alguna ventaja / desventaja en el uso de MATLAB Coder? Es un producto nuevo y muy caro, pero aparte del tiempo que ahorra en la traducción, ¿hay algún otro beneficio?


Creo que MATLAB tiene muchas limitaciones sobre la codificación C normal. Estoy de acuerdo en que hay tantos bloques incorporados que se pueden usar directamente, pero si escribes un código en MATLAB, tardarás casi 5 veces más en comparación con el código C porque desde definir variables hasta tomar bucles, cambiar de caja, es muy lento en modelado MATLAB

Y supongamos que ha creado un modelo con Simulink, pero cuando intenta agregar algo, consume mucho tiempo, pero en C es una tarea de solo 2 minutos.

El siguiente problema es que no puede comentar ningún modelo como lo hace en otros lenguajes de programación.

Para un gran proyecto, a veces MATLAB se cuelga, se corregía, a veces se cuelga y la simulación en stateflow es como un sh * t.

Al final solo digo una cosa, que use el modelado MATLAB (stateflow + simulink) solo si tiene mucha paciencia.


Si le resulta más fácil escribir en MATLAB, entonces el valor dependerá en gran medida de cuánto valore su tiempo.

Comparar MATLAB y C o C ++ para el rendimiento es muy complicado. C o C ++ van a ser más rápidos en la mayoría de los casos, pero en algunas aplicaciones de álgebra lineal es posible que MATLAB ejecute el más rápido. Recuerdo a un profesor que afirmó que tenía aplicaciones FORTRAN que corrían más lento que su equivalente en MATLAB. Hay muchos estudios de casos sobre esto. Le recomendaría que observe los diferentes estudios que comparan la velocidad que aparece en Google y los compara con lo que hace para tomar una decisión.


Ventaja:

  1. Hay muchas funciones matemáticas complejas disponibles.
  2. Para la programación de matemáticas hardcore relacionada.

Desventaja:

  1. No es popular comparado con otros lenguajes modernos como C #, java, python. lo que sea
  2. Dado que codifica Matlab, tiende a centrarse principalmente en la resolución de problemas matemáticos complejos. Otros idiomas se utilizan en tareas de variedad, desde dibujo, desarrollo web y matemáticas también (no tiene funciones matemáticas ricas como Matlab, por cierto)

Otro de los beneficios que conozco: dado que está optimizado para la programación técnica, es posible que tenga un mejor rendimiento al escribir aplicaciones en este campo. El rendimiento es muy confiable, eche un vistazo a esta pregunta, proporciona información útil .


Renuncia

Esta es una publicación muy dogmática basada en mi vencimiento para un proyecto en particular. No he usado la última versión del codificador, pero sí tengo experiencia con el producto equivalente (codificador incorporado) para convertir el código de Matlab a C ++ que se incluyó como parte del anterior producto Real Time Workshop. Estos comentarios deben aplicarse. Su experiencia puede ser diferente.

Beneficios iniciales ...

En mi situación, el codificador incorporado se usó para hacer un bloque de procesamiento que encajara en una aplicación de audio más grande. El bloque de procesamiento tenía el trabajo de procesar un flujo constante de almacenamientos intermedios de muestras en tiempo real. Hice el algoritmo original en matlab, y la herramienta de conversión simplificó bastante la conversión de un prototipo inicial en algo que podría compilarse con código nativo y usarse en una aplicación en tiempo real. También fue agradable suponer que el código convertido funcionaba numéricamente de forma idéntica al original sin posibilidad de error humano en el proceso de conversión (asumiendo habilidades sobrehumanas de los ingenieros de Mahworks).

Los beneficios terminaron después de esta etapa muy temprana de creación de prototipos ...

Problema 1: Perdiendo la interfaz de tiempo

A medida que el algoritmo creció en complejidad, comencé a preocuparme cada vez más acerca de cómo codificar la interfaz de matlab para que después de la conversión fuera fácil interactuar con el framework C ++ (quería monitorear los estados internos en tiempo real). . Eventualmente, esto comenzó a usar tanto tiempo como el propio desarrollo del algoritmo en sí mismo, derrotando así el propósito de usar dicha herramienta. Pude haber descompuesto el algoritmo en trozos más pequeños y luego pegarlos con C ++, pero luego perdería la capacidad de tener una comparación directa de Matlab del algoritmo completo.

Problema 2: no todas las funciones son compatibles o compatibles

El codificador admite un subconjunto del lenguaje Matlab . En algunos casos, las funciones compatibles están limitadas de alguna manera. Por ejemplo, en la aplicación en la que estaba trabajando, quería poder modificar las características de un filtro en tiempo real. No pude usar las funciones de creación de prototipos del filtro Matlab estándar, porque la herramienta de generación de código no permitiría las llamadas a la función de creación de prototipos de filtros con argumentos variables. Terminé pasando tiempo con un libro de DSP desarrollando mi propia implementación, a pesar de que tenemos una licencia de caja de herramientas de procesamiento de señales.

Problema 3: el código generado automáticamente era ineficiente

Me frustré con los problemas de la interfaz y codifiqué el algoritmo a mano en C ++. Para mi aplicación, hubo un aumento del rendimiento del 75% a favor del código escrito a mano sobre el código convertido. Las diferencias de rendimiento serán muy diferentes dependiendo de su aplicación, probablemente la versión de la herramienta de conversión utilizada y su afición por su generador de perfiles. La herramienta de conversión en sí es un producto complejo que tiene muchas configuraciones para aprender. Tratar de encontrar la manera de ajustar la configuración y el código matlab para mejorar el rendimiento utiliza más tiempo que podría emplearse en la codificación manual.

No he usado la herramienta de conversión desde ...

Ahora prefiero un enfoque más asistido por prueba. Codifico un prototipo en Matlab y lo retoco hasta que estoy seguro de que se comporta como yo quiero. Luego pienso en C ++ y recodio el algoritmo de una manera que es más natural para ese lenguaje. Luego hago un archivo mex que interactúa con mi código C ++, así que puedo probarlo con mi equivalente de Matlab de confianza. Para el espacio problemático en el que trabajo, esta es una forma mucho más eficiente (humana y de máquina) de hacer las cosas.

En conclusión, esta es solo la opinión de un usuario. Tal vez (como se sugirió en un comentario en su publicación original) debe inscribirse en la versión de prueba para ver cómo se lleva bien. Sin embargo, si eres un poco ninja de C ++, probar construyendo archivos mex no requiere una licencia costosa para un producto complementario y te hará un mejor desarrollador.