Quelques informations pour les personnes qui liront ceci à l’avenir (au cas où ce n’est pas verrouillé). J'ai tendance à faire ma programmation dans un langage de haut niveau pour comprendre le problème en premier. Après avoir couvert tous les cas possibles, je procède à la traduction du code en C++ (ou C).
La plupart du code que j'écris contient des maths et MATLAB est donc le langage que j'utilise (l'alternative pour moi est Python). Quoi qu'il en soit, j'ai ensuite traduit manuellement le code de MATLAB en C++.
Est-ce que quelqu'un sait s'il y a un avantage/un inconvénient à utiliser MATLAB Coder? C'est un nouveau produit très coûteux, mais à part le temps gagné en traduction, y a-t-il un autre avantage?
Avertissement
Ceci est un post très basé sur mon expérience personnelle pour un projet particulier. Je n'ai pas utilisé la dernière version du codeur, mais j'ai déjà utilisé le produit équivalent (codeur intégré) pour convertir le code matlab en C++ inclus dans l'ancien produit Real Time Workshop. Ces commentaires devraient toujours s'appliquer. Votre kilométrage peut varier.
Premiers avantages ...
Dans mon cas, le codeur intégré a été utilisé pour créer un bloc de traitement qui s’intègre dans une application audio plus grande. Le bloc de traitement avait pour tâche de traiter un flux constant de tampons d'échantillon en temps réel. J'ai créé l'algorithme original dans matlab, et l'outil de conversion a rendu assez simple la conversion d'un prototype précédent en quelque chose qui pourrait être compilé en code natif et utilisé dans une application en temps réel. Il était également agréable de supposer que le code converti fonctionnait numériquement de la même manière que le code original, sans possibilité d'erreur humaine dans le processus de conversion (en supposant des capacités surhumaines des ingénieurs de Mahworks).
Les avantages ont pris fin après cette étape très précoce du prototypage ...
Problème 1: perdre du temps en interfaçant
Au fur et à mesure que la complexité de l'algorithme augmentait, j'ai commencé à m'inquiéter de plus en plus sur la manière de coder l'interface matlab de la fonction afin qu'après la conversion, il soit facile de faire l'interface avec le framework C++ (je voulais surveiller les états internes en temps réel) . Cela a finalement commencé à utiliser autant de temps que le développement de l’algorithme lui-même, annulant ainsi le but d’utiliser un tel outil. J'aurais pu décomposer l'algorithme en morceaux plus petits, puis les coller en utilisant C++, mais je n'aurais plus la possibilité de faire une comparaison directe uniquement avec Matlab de l'algorithme complet.
Problème 2: Toutes les fonctions ne sont pas supportées ou supportées complètement
Le codeur prend en charge un sous-ensemble du langage Matlab . Dans certains cas, les fonctions prises en charge sont limitées d'une manière ou d'une autre. Par exemple, dans l'application sur laquelle je travaillais, je voulais pouvoir modifier les caractéristiques d'un filtre en temps réel. Je ne pouvais pas utiliser les fonctions de prototypage de filtre Matlab standard, car l'outil de génération de code n'autorisait pas les appels à la fonction de prototypage de filtre avec des arguments variables. J'ai fini par passer du temps avec un livre DSP à développer ma propre implémentation, même si nous avons une licence de boîte à outils de traitement de signal.
Problème 3: Le code généré automatiquement était inefficace
J'étais frustré par les problèmes d'interface et codais l'algorithme à la main en C++. Pour mon application, il y avait une amélioration de performance de 75% en faveur du code manuscrit par rapport au code converti. Les différences de performances seront très différentes selon votre application, probablement la version de l'outil de conversion utilisé et votre goût pour votre profileur. L'outil de conversion lui-même est un produit complexe comportant de nombreux paramètres à apprendre. Essayer de savoir comment ajuster les paramètres et le code matlab pour améliorer les performances utilise plus de temps qui pourrait être passé à coder à la main.
Je n'ai pas utilisé l'outil de conversion depuis ...
Je préfère maintenant une approche plus test -assistée. Je code un prototype dans Matlab et Tweak jusqu'à ce que je sois sûr qu'il se comporte comme je le veux aussi. Je pense alors en C++ et recode l'algorithme d'une manière plus naturelle pour ce langage. Je crée ensuite un fichier mex qui s'interface avec mon code C++ pour le tester par rapport à mon équivalent matlab de confiance. Pour l'espace de problèmes dans lequel je travaille, c'est une manière beaucoup plus efficace (humaine et machine) de faire avancer les choses.
En conclusion, il ne s'agit que de l'opinion d'un utilisateur. Peut-être (comme suggéré dans un commentaire sur votre message original) vous devriez vous inscrire à l'essai pour voir comment vous vous en sortez. Cependant, si vous êtes un peu un ninja C++, tester en construisant des fichiers mex ne nécessite pas une licence onéreuse pour un produit add-on et cela fera de vous un meilleur développeur.
S'il est plus facile pour vous d'écrire dans MATLAB, la valeur dépendra grandement de la valeur que vous accordez à votre temps.
Comparer les performances de MATLAB et C ou C++ est très compliqué. C ou C++ vont être plus rapides dans la plupart des cas, mais dans certaines applications d'algèbre linéaire, il est possible que MATLAB s'exécute le plus rapidement. Je me souviens d'un professeur qui prétendait avoir des applications FORTRAN plus lentes que l'équivalent dans MATLAB. Il existe de nombreuses études de cas à ce sujet. Je vous recommanderais de regarder les différentes études comparant la vitesse qui apparaît dans Google et de les comparer à ce que vous faites pour prendre votre décision.
Tout est question de processus.
Là où je travaille, nous avons développé un bon schéma de gestion pour nos modèles Simulink et leurs dépendances. Ensuite, j'ai développé un script pour passer à l'étape d'autocodage et un collègue a développé les fichiers de projet dans un IDE. , où quelqu'un d'autre a également déployé un code wrapper pour interfacer le logiciel autocodé.
Le truc (IMHO) consiste à automatiser au mieux votre processus le plus tôt possible. Ce faisant, vous pouvez développer des modèles très complexes et créer un code C pour la production en quelques heures. Et vous pouvez mettre à jour les modèles à votre guise, mais le code reste facile à gérer.
L'inconvénient est que la mise en place de ce processus n'est ni triviale ni totalement générique (une taille ne convient pas à la plupart).
En outre, vous devriez vraiment mettre en place des tests pour vérifier que le code généré représente bien le modèle que vous aviez. Cela n’est pas garanti, et bien que je pense que Matlab Coder est assez fiable, il n’est pas exempt d’erreurs.
Avantage:
Désavantage:
Un autre avantage que je connais: comme il est optimisé pour la programmation technique, vous pouvez obtenir de meilleures performances lors de l’écriture d’application sur ce domaine. La performance est très fiable, jetez un oeil à cette question, il fournit quelques informations utiles .
Comme il a été dit plus haut, cela dépend de votre application. J'ai essayé de convertir le décodeur (d'un système de communication), il donne des résultats précis, mais pour un grand nombre de bits, il est plus lent que sa propre version de MATLAB. Ma conclusion était donc de convertir le code MATLAB en C manuellement.
Je pense que MATLAB a beaucoup de limitations sur le codage C normal. Je conviens qu'il y a tellement de blocs incorporés qui peuvent être utilisés directement, mais si vous écrivez un code dans MATLAB, cela prendra près de 5 fois plus de temps que le code C car, de la définition de variables à la prise de boucles en passant par les cas dans la modélisation MATLAB
Et supposons que vous ayez créé un modèle avec Simulink, mais que vous essayez d'ajouter quelque chose, cela prend beaucoup de temps, mais en C, la tâche ne dure que 2 minutes.
Le problème suivant est que vous ne pouvez commenter aucun élément de modèle comme vous le faites dans d'autres langages de programmation.
Pour un gros projet, MATLAB est parfois bloqué, parfois bloqué et la simulation dans le flux d'état est comme un sh * t.
En fin de compte, je ne dis qu'une chose: utiliser la modélisation MATLAB (stateflow + simulink) uniquement si vous avez beaucoup de patience.