J'ai beaucoup de code MATLAB qui doit être porté en C (la vitesse d'exécution est critique pour ce travail) dans le cadre d'un processus back-end pour une application Web. Lorsque j'essaie d'externaliser ce code à un développeur C, je suppose (corrigez-moi si je me trompe) que peu de développeurs C comprennent également le code MATLAB (des choses comme l'indexation et la gestion de la mémoire sont différentes, etc.). Je me demande s'il y a des développeurs C qui peuvent recommander une procédure à suivre pour mieux communiquer ce que fait le code?
Par exemple, dois-je fournir le code MATLAB et expliquer ce qu'il fait ligne par ligne? Ou, dois-je simplement fournir les mathématiques / algorithmes, les expliquer en anglais simple et laisser le développeur C les implémenter à sa manière (par exemple, puis-je supposer que le développeur comprend comment travailler avec des mathématiques complexes (c.-à-d. Imaginaires) nombres), comment générer des histogrammes, effectuer une FFT, etc.)?
Ou existe-t-il une meilleure méthode? Je m'attends à ce que je ne sois pas le premier à avoir besoin de le faire, donc je me demande si des développeurs C ont rencontré cette situation et peuvent partager une sagesse conventionnelle sur la façon dont ils aimeraient que cette tâche soit transférée?
Merci d'avance pour vos commentaires.
mcc -c matlabfile.m
Réponses:
Je suis dans une situation similaire à la vôtre car j'ai également des gens qui portent mon code Matlab en C ++.
Cela dépend beaucoup de la complexité de votre code, ainsi que du niveau de compétence du développeur C / C ++ et de sa compréhension de ce qu'il est censé implémenter - mieux il est et mieux il comprend votre problème, plus indépendamment, ils peuvent travailler.
Étant donné que la traduction directe du code Matlab en C / C ++ n'est peut-être pas le moyen le plus efficace de gérer un problème, je vous suggère de bien communiquer ce qu'est l'entrée, ce que le code doit faire et ce qu'il est censé retourner en sortie. Vous devez également fournir des moyens de tester le code pour vous assurer qu'il fonctionne correctement - à la fois pour aider au débogage et pour fournir un moyen de contrôle de la qualité. En plus de cela, vous devez fournir et expliquer le code Matlab comme une indication approximative de la façon dont le résultat peut être atteint.
Vous devriez pouvoir supposer que le développeur sait comment structurer un programme et comment utiliser les outils de débogage. Cependant, vous ne pouvez pas nécessairement supposer que le développeur sait avoir des connaissances spécifiques, par exemple en statistiques ou en optimisation (mathématique). Ainsi, le débogage de ces parties sera beaucoup plus rapide avec votre entrée.
Il peut être utile de planifier des réunions régulières avec le développeur, afin que les "petites choses" qui peuvent sembler un peu étranges au développeur, mais qui vous signalent des problèmes importants, puissent être communiquées avant qu'elles ne dégénèrent en gros problèmes.
la source
Je ne dis pas que cela s'applique à vous, mais: la plupart des gens qui ne codent que dans MATLAB écrivent du mauvais code. Très mauvais, avec un formatage, une structure et une documentation médiocres.
Dans ce cas, le seul moyen simple d'utiliser le code MATLAB est de l'exécuter pour vérifier les résultats du code porté. Essayer de désosser le code MATLAB sans documentation supplémentaire est quelque chose qui ne devrait être entrepris que si l'auteur original du code MATLAB est réellement mort ou comateux. D'un autre côté, un article mathématique bien écrit sur un algorithme est généralement beaucoup plus utile que l'implémentation de l'étudiant diplômé de l'auteur.
Pour faciliter la tâche à la personne qui porte votre code:
Refactorisez votre code pour vous assurer que les opérations sont réparties en différentes fonctions. Le style une fonction par fichier de MATLAB encourage les fonctions à être trop longues et à englober trop d'opérations. Assurez-vous également que le code dupliqué est extrait pour les fonctions d'assistance, même si cela entraîne plus de fichiers que vous ne souhaiteriez normalement travailler avec un projet MATLAB.
Expliquez les nombres magiques ou constantes utilisés dans votre code et les conditions dans lesquelles ils sont valides.
Documentez les structures de données de votre code. Le style «tout est une matrice» de MATLAB est très différent de la plupart des langues, et cela signifie souvent que vos structures de données sont définies implicitement par la façon dont vous utilisez les matrices. Le programmeur AC devra comprendre comment configurer les différentes structures et allouer les tableaux nécessaires, alors assurez-vous qu'il est clair quelles sont les significations et les structures internes de vos variables.
Documentez les algorithmes utilisés par votre code. En particulier, assurez-vous qu'il est clair ce qui se passe lorsque vous utilisez des fonctions et des opérateurs de tableau complet compliqués, et assurez-vous que le programmeur C a accès aux références sur les algorithmes utilisés par les fonctions de boîte à outils ou les fonctions de bibliothèque standard qui sont plus compliquées que Fonctions BLAS.
Documentez tout ce que vous avez fait pour rendre le code robuste, comme la validation des entrées et la gestion des erreurs. La façon dont vous l'avez implémentée est probablement très différente de la façon dont cela devra être fait en C. Les universitaires qui écrivent du code MATLAB se donnent rarement la peine de se renseigner sur des choses comme la gestion des exceptions. Si vous n'avez rien fait pour rendre votre code robuste, documentez au moins ce qui pourrait être fait à propos d'une entrée non valide ou de données incomplètes ou défectueuses.
Assurez-vous que la personne qui porte le code est en mesure de comparer la sortie avec le code MATLAB d'origine et, si possible, de fournir une suite complète de tests d'entrée et de sortie correcte.
Si la personne qui effectue le portage ne connaît pas l'analyse numérique, vous devrez superviser le processus de portage et vous assurer que vous passez en revue et comprenez le code C. Ce sera très instructif pour vous deux.
la source
Les langages de programmation sont beaucoup plus faciles à lire qu'à écrire. La plupart des programmeurs C avec un minimum d'expérience devraient être en mesure de lire votre code Matlab très bien avec l'accès à une référence, et en particulier avec l'accès à un programmeur Matlab pour répondre à leurs questions. Le code de toute sorte est beaucoup moins ambigu que la plupart des exigences sur lesquelles nous devons travailler.
S'ils ont un baccalauréat en informatique ou en génie informatique, ils auront probablement suivi le calcul, la trigonométrie et l'algèbre linéaire, mais cela peut être rouillé. À moins de faire beaucoup de programmation scientifique / mathématique, la plupart des programmeurs C sauront ce qu'est une FFT, mais rarement ou jamais dû en faire une. Votre candidat idéal aura tout cela frais dans son esprit, mais toute personne diplômée devrait être capable de gérer les mathématiques avec une étude de recyclage. Dans les deux cas, vous voulez quelqu'un qui met l'accent sur la recherche de bibliothèques existantes pour des opérations courantes comme celle-ci chaque fois que possible plutôt que de rouler les leurs.
Le talent pour pouvoir optimiser le temps d'exécution de l'algorithme varie considérablement, même parmi les programmeurs expérimentés. Je vous recommanderais d'avoir un problème d'entrevue pour le découvrir. Montrez aux candidats un algorithme simple mais intentionnellement inefficace et demandez-leur ce qu'il fait. Voyez s'ils évoquent eux-mêmes son inefficacité. Demandez-leur quelle est la complexité asymptotique et ce qu'elle devrait être. Demandez-leur comment ils réécriraient pour améliorer l'efficacité.
la source
La raison financière de ne pas utiliser le compilateur matlab est bien compréhensible. Cependant, vous pouvez utiliser le convertisseur gratuit de scilab en C. La procédure serait
Idéalement, aucune connaissance de Scilab n'est nécessaire dans le processus et il est assez facile de prendre un peu de temps pour essayer cette solution (en pratique, ce n'est peut-être pas aussi simple ...)
Remarque: je n'ai pas essayé cela mais c'est une solution que j'envisage pour des raisons similaires.
la source
Développez un bon ensemble de tests que vous pouvez exécuter dans les deux applications, puis jetez un œil aux métriques.
Cela aidera grandement votre développeur à tester son code et garantira que la qualité est à un niveau raisonnable.
la source
Excellent article de Jonas, en particulier le point sur la manière de tester le code. Voici quelques suggestions supplémentaires:
Partage de code. Pensez à fournir la source MATLAB mais soyez prêt à expliquer sa structure ou d'autres détails (de la syntaxe à votre style personnel). Nous espérons que le développeur C reconnaîtra les concepts, algorithmes et mathématiques de haut niveau ( et j'espère que vous avez commenté votre code ).
Documentation. Il sera crucial que vous ayez une documentation claire qui définit le projet; après tout, si la personne ne parle pas couramment MATLAB, le code peut ne pas être une référence très utile.
Exercer les compétences des personnes. Cela peut être évident, mais il est bon de garder à l'esprit lors de la collaboration, en particulier à ce niveau micro. Vous devez donc essayer de supprimer autant d'ambiguïté que possible de votre code / documentation. Selon votre niveau de leadership dans le projet, vous constaterez peut-être que vous êtes en train de trouver un équilibre entre guider le développement et laisser la personne apporter sa propre contribution individuelle.
la source
À moins que vos codeurs C n'utilisent les bonnes bibliothèques, Matlab est bien meilleur dans des choses aussi triviales que d'inverser une matrice. Un C naïf impl. n'est pas assez stable. L'embauche de codeurs C coûterait cher. J'essaierais de porter du code Matlab pour scipy et comparer la vitesse, essayer d'utiliser le compilateur c de Matlab, ou ... simplement jeter plus de matériel dessus - cela pourrait être beaucoup moins cher et plus simple et plus sûr et plus rapide.
la source