Ich habe eine Menge MATLAB-Code, der im Rahmen eines Back-End-Prozesses für eine Webanwendung nach C portiert werden muss (Ausführungsgeschwindigkeit ist für diese Arbeit von entscheidender Bedeutung). Wenn ich versuche, diesen Code an einen C-Entwickler auszulagern, gehe ich davon aus (korrigiere mich, wenn ich mich irre), dass nur wenige C-Entwickler auch MATLAB-Code verstehen (Dinge wie Indexierung und Speicherverwaltung sind unterschiedlich usw.). Ich frage mich, ob es C-Entwickler gibt, die mir ein Verfahren empfehlen können, mit dem ich am besten kommunizieren kann, was der Code bewirkt.
Soll ich beispielsweise den MATLAB-Code bereitstellen und zeilenweise erklären, was er tut? Oder sollte ich nur die Mathematik / den Algorithmus bereitstellen, sie / ihn in einfachem Englisch erklären und den C-Entwickler mit diesem Verständnis auf seine / ihre eigene Weise implementieren lassen (z. B. kann ich davon ausgehen, dass der Entwickler versteht, wie man mit komplexer Mathematik arbeitet (dh imaginär)? Zahlen), wie man Histogramme erstellt, eine FFT durchführt, etc.)?
Oder gibt es eine bessere Methode? Ich gehe davon aus, dass ich nicht der erste bin, der dies tun muss, und frage mich, ob C-Entwickler in diese Situation geraten sind und wissen, wie diese Aufgabe übertragen werden soll.
Vielen Dank im Voraus für alle Kommentare.
mcc -c matlabfile.m
Antworten:
Ich bin in einer ähnlichen Situation wie Sie, in der auch Leute meinen Matlab-Code nach C ++ portieren.
Viel hängt von der Komplexität Ihres Codes sowie vom Kenntnisstand des C / C ++ - Entwicklers ab und davon, was er implementieren soll - je besser er ist und je besser er Ihr Problem versteht, desto mehr unabhängig können sie arbeiten.
Da die direkte Übersetzung von Matlab-Code in C / C ++ möglicherweise nicht die effizienteste Methode zur Behebung eines Problems ist, empfehle ich, dass Sie gut kommunizieren, was die Eingabe ist, was der Code tun sollte und was er als Ausgabe zurückgeben soll. Sie sollten auch Möglichkeiten zum Testen des Codes bereitstellen, um sicherzustellen, dass er ordnungsgemäß funktioniert - sowohl als Hilfe zum Debuggen als auch als Mittel zur Qualitätskontrolle. Darüber hinaus sollten Sie den Matlab-Code als grobe Richtlinie für die Erzielung des Ergebnisses angeben und erläutern.
Sie sollten davon ausgehen können, dass der Entwickler mit der Strukturierung eines Programms und der Verwendung von Debugging-Tools vertraut ist. Es kann jedoch sein, dass Sie nicht unbedingt davon ausgehen können, dass der Entwickler über spezifische Kenntnisse in den Bereichen Statistik oder (mathematische) Optimierung verfügt. Das Debuggen dieser Teile ist mit Ihrer Eingabe also viel schneller.
Es kann hilfreich sein, regelmäßige Besprechungen mit dem Entwickler zu planen, sodass "kleine Dinge", die sich für den Entwickler etwas seltsam anfühlen, Ihnen jedoch wichtige Probleme anzeigen, kommuniziert werden können, bevor sie zu großen Problemen werden.
quelle
Ich sage nicht, dass dies auf Sie zutrifft, aber: Die meisten Leute, die nur in MATLAB programmieren, schreiben schlechten Code. Sehr schlecht, mit schlechter Formatierung, Struktur und Dokumentation.
In diesem Fall können Sie den MATLAB-Code nur dann verwenden, wenn Sie ihn ausführen, um die Ergebnisse des portierten Codes zu überprüfen. Der Versuch, den MATLAB-Code ohne zusätzliche Dokumentation zurückzuentwickeln, sollte nur unternommen werden, wenn der ursprüngliche Autor des MATLAB-Codes tatsächlich tot oder im Koma liegt. Andererseits ist eine gut geschriebene mathematische Arbeit über einen Algorithmus in der Regel viel hilfreicher als die Implementierung durch den Doktoranden.
So erleichtern Sie der Person, die Ihren Code portiert:
Überarbeiten Sie Ihren Code, um sicherzustellen, dass die Operationen in verschiedene Funktionen unterteilt sind. Der MATLAB-Stil "Eine Funktion pro Datei" ermutigt Funktionen, zu lang zu sein und zu viele Operationen zu umfassen. Stellen Sie außerdem sicher, dass doppelter Code für Hilfsfunktionen abgerufen wird, auch wenn dies zu mehr Dateien führt, als Sie normalerweise für ein MATLAB-Projekt benötigen.
Erklären Sie alle in Ihrem Code verwendeten magischen Zahlen oder Konstanten und die Bedingungen, unter denen sie gültig sind.
Dokumentieren Sie die Datenstrukturen Ihres Codes. MATLABs "Alles ist eine Matrix" -Stil unterscheidet sich stark von den meisten Sprachen, und dies bedeutet häufig, dass Ihre Datenstrukturen implizit durch die Verwendung der Matrizen definiert werden. Der AC-Programmierer muss herausfinden, wie die verschiedenen Strukturen eingerichtet und die erforderlichen Arrays zugewiesen werden. Stellen Sie daher sicher, dass klar ist, welche Bedeutung und internen Strukturen Ihre Variablen haben.
Dokumentieren Sie die von Ihrem Code verwendeten Algorithmen. Stellen Sie insbesondere sicher, dass klar ist, was passiert, wenn Sie komplizierte Ganz-Array-Funktionen und -Operatoren verwenden, und dass der C-Programmierer Zugriff auf Referenzen zu den Algorithmen hat, die von Toolbox-Funktionen oder Standardbibliotheksfunktionen verwendet werden, die komplizierter sind als BLAS funktioniert.
Dokumentieren Sie alles, was Sie getan haben, um den Code stabiler zu machen, z. B. die Eingabevalidierung und die Fehlerbehandlung. Die Art und Weise, wie Sie es implementiert haben, unterscheidet sich wahrscheinlich stark von der Vorgehensweise in C. Akademiker, die MATLAB-Code schreiben, müssen sich selten mit Dingen wie der Ausnahmebehandlung auseinandersetzen. Wenn Sie nichts unternommen haben, um Ihren Code sicherer zu machen, sollten Sie zumindest dokumentieren, was gegen ungültige Eingaben, fehlerhafte oder unvollständige Daten unternommen werden könnte.
Stellen Sie sicher, dass die Person, die den Code portiert, die Ausgabe mit dem ursprünglichen MATLAB-Code vergleichen kann, und stellen Sie nach Möglichkeit eine gründliche Testsuite mit Eingaben und korrekten Ausgaben bereit.
Wenn die Person, die die Portierung durchführt, die numerische Analyse nicht kennt, müssen Sie den Portierungsprozess überwachen und sicherstellen, dass Sie den C-Code überprüfen und verstehen. Es wird für euch beide sehr lehrreich sein.
quelle
Programmiersprachen sind viel einfacher zu lesen als zu schreiben. Die meisten C-Programmierer mit ein wenig Erfahrung sollten in der Lage sein, Ihren Matlab-Code mit Zugriff auf eine Referenz und insbesondere mit Zugriff auf einen Matlab-Programmierer zu lesen, um ihre Fragen zu beantworten. Code jeglicher Art ist viel weniger zweideutig als die meisten Anforderungen, an denen wir arbeiten müssen.
Wenn sie einen Bachelor-Abschluss in Informatik oder Computertechnik haben, haben sie wahrscheinlich Analysis, Trigonometrie und lineare Algebra genommen, aber es kann rostig sein. Die meisten C-Programmierer werden wissen, was eine FFT ist, wenn sie nicht viel wissenschaftlich / mathematisch programmieren, aber sie müssen selten oder nie eine FFT durchführen. Ihr idealer Kandidat wird all das frisch im Kopf haben, aber jeder mit einem Abschluss sollte in der Lage sein, die Mathematik mit einem Auffrischungsstudium zu bewältigen. In beiden Fällen möchten Sie jemanden, der nach Möglichkeit Wert darauf legt, vorhandene Bibliotheken für solche allgemeinen Operationen zu finden, anstatt ihre eigenen zu rollen.
Das Talent zur Optimierung der Ausführungszeit von Algorithmen ist selbst bei erfahrenen Programmierern sehr unterschiedlich. Ich würde empfehlen, dass Sie ein Interviewproblem haben, um das herauszufinden. Zeigen Sie den Kandidaten einen einfachen, aber absichtlich ineffizienten Algorithmus und fragen Sie sie, was er tut. Sehen Sie nach, ob sie ihre Ineffizienz selbst zur Sprache bringen. Fragen Sie sie, wie hoch die asymptotische Komplexität ist und wie sie sein sollte. Fragen Sie sie, wie sie neu schreiben würden, um die Effizienz zu verbessern.
quelle
Der finanzielle Grund für die Nichtbenutzung des Matlab-Compilers ist verständlich. Sie können jedoch den kostenlosen Konverter von Scilab nach C verwenden. Das Verfahren wäre
Im Idealfall sind keine Scilab-Kenntnisse erforderlich, und es ist einfach genug, diese Lösung einige Zeit in Anspruch zu nehmen (in der Praxis ist sie möglicherweise nicht so einfach ...).
Hinweis: Ich habe dies nicht ausprobiert, aber aus ähnlichen Gründen stelle ich mir eine Lösung vor.
quelle
Entwickeln Sie ein gutes Test-Set, mit dem Sie beide Anwendungen durchlaufen und sich dann die Metriken ansehen können.
Dies hilft Ihrem Entwickler beim Testen seines Codes und stellt sicher, dass die Qualität auf einem angemessenen Niveau liegt.
quelle
Großartiger Beitrag von Jonas, insbesondere der Punkt, wie man den Code testen kann. Hier sind einige zusätzliche Vorschläge:
Code teilen. Überlegen Sie, ob Sie die MATLAB-Quelle bereitstellen, aber erklären Sie deren Struktur oder andere Details (von der Syntax bis zu Ihrem persönlichen Stil). Der C-Entwickler wird hoffentlich die Konzepte, Algorithmen und Mathematik auf hoher Ebene erkennen ( und hoffentlich haben Sie Ihren Code kommentiert ).
Dokumentation. Es ist von entscheidender Bedeutung, dass Sie eine klare Dokumentation haben, die das Projekt definiert. Wenn die Person nicht fließend mit MATLAB umgehen kann, ist der Code möglicherweise keine sehr nützliche Referenz.
Übung People Skills. Dies mag offensichtlich sein, es ist jedoch ratsam, dies bei der Zusammenarbeit zu berücksichtigen, insbesondere auf dieser Mikroebene. Deshalb sollten Sie versuchen, so viele Mehrdeutigkeiten wie möglich aus Ihrem Code / Ihrer Dokumentation zu entfernen. Abhängig von Ihrer Führungsebene im Projekt stellen Sie möglicherweise fest, dass Sie ein Gleichgewicht zwischen der Lenkung der Entwicklung und dem Ermöglichen, dass die Person ihren eigenen individuellen Beitrag leistet.
quelle
Wenn Ihre C-Codierer nicht die richtigen Bibliotheken verwenden, ist Matlab in so einfachen Dingen wie dem Invertieren einer Matrix viel besser. Ein naives C impl. ist nicht stabil genug. Die Einstellung von C-Codierern wäre teuer. Ich würde versuchen, Matlab-Code zu portieren, um zu scipen und die Geschwindigkeit zu vergleichen, den c-Compiler von Matlab zu verwenden oder ... einfach mehr Hardware darauf zu werfen - es könnte viel billiger und einfacher und sicherer und schneller sein.
quelle