2012-06-07 10 views
39

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).Matlab Coder vs hand coding?

La mayor parte del código que escribo tiene matemática y por eso 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?

+7

¿Por qué no acaba de descargar la versión de prueba de MATLAB Coder, ver cómo funciona para usted y comparar los resultados con el trabajo anterior que ha realizado? – mpontes

+0

¿Qué le parece usar un lenguaje de alto nivel que sea agradable para trabajar, pero aún así compila rápidamente el código nativo, de inmediato? Haskell es bastante bueno. C++ 11 tampoco está mal, tampoco. – leftaroundabout

+0

Es cierto, pero Matlab tiene muchas funciones incorporadas que son muy convenientes. – s5s

Respuesta

40

Negación

Este es un post muy obstinado en base a mi Expirience 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.

primeros beneficios ...

En mi situación, el codificador incorporado se utilizó para hacer un bloque de procesamiento que encajan en parte de 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 fase de prototipo muy temprano ...

Problema 1: Desperdicio de tiempo interconexión

Como el algoritmo creció en complejidad, empecé a preocuparme más y más acerca de cómo codificar el interfaz de matlab a la función para que después de la conversión, sería fácil interactuar con el marco 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 están soportadas o totalmente compatibles

El codificador soporta una subset of the Matlab language. 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: código generado automáticamente era ineficiente

llegué frustrado con los problemas de interfaz y el algoritmo codificado 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 utilizado la herramienta de conversión desde ...

ahora prefieren un enfoque más Test- asistida. 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.

+1

"Test-assisted" como lo llamas es una práctica estándar. Mantenga el código original de matlab para las pruebas de no regresión y tenga un flujo de trabajo bueno y eficiente. –

2

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

La comparación de MATLAB y C o C++ para el rendimiento es muy complicada. 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.

+0

No creo que pregunte si vale la pena convertir de MATLAB a C, pero cuál es el mejor enfoque. – bakalolo

0

Ventaja:

  1. Una gran cantidad de funciones matemáticas complejas están disponibles.
  2. Para la programación matemática hardcore relacionada.

Desventaja:

  1. No es muy popular en comparación 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. También se usan otros idiomas en tareas de variedad como dibujo, desarrollo web y matemáticas (no tiene funciones matemáticas ricas como Matlab)

Otro beneficio que conozco: dado que está optimizado para la programación técnica, puede tener un mejor rendimiento al escribir la aplicación en este campo. El rendimiento es muy confiable, eche un vistazo a esta pregunta, proporciona some helpful information.

0

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 el modelado MATLAB

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

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

Para un proyecto grande, a veces MATLAB se cuelga, se corregido, 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.

0

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.

Cuestiones relacionadas