Mam dużo kodu MATLAB, który musi zostać przeniesiony do C (szybkość wykonania jest kluczowa dla tej pracy) w ramach procesu zaplecza dla aplikacji sieci web. Kiedy próbuję zlecić ten kod deweloperowi języka C, zakładam (popraw mnie, jeśli się mylę), że kilku programistów języka C również rozumie kod MATLAB (rzeczy takie jak indeksowanie i zarządzanie pamięcią są różne itp.). Zastanawiam się, czy są jacyś programiści C, którzy mogliby polecić mi procedurę postępowania w celu jak najlepszego komunikowania się z kodem?
Na przykład, czy powinienem podać kod MATLAB i wyjaśnić, co robi wiersz po wierszu? Lub powinienem tylko podać matematykę / algorytm, wyjaśnić go prostym językiem angielskim i pozwolić programistowi C wdrożyć go z takim zrozumieniem na swój własny sposób (np. Czy mogę założyć, że programista rozumie, jak pracować ze złożoną matematyką (tj. Wyobrażony liczby), jak wygenerować histogramy, wykonać FFT itp.)?
Czy jest lepsza metoda? Spodziewam się, że nie jestem pierwszym, który musiałby to zrobić, więc zastanawiam się, czy jakikolwiek programiści C natknęli się na tę sytuację i mogą podzielić się wszelkimi konwencjonalnymi poglądami, w jaki sposób chcieliby przenieść to zadanie?
Z góry dziękuję za wszelkie komentarze.
mcc -c matlabfile.m
Odpowiedzi:
Znajduję się w podobnej sytuacji jak Ty, ponieważ mam również ludzi, którzy przenoszą mój kod Matlab do C ++.
Wiele zależy od złożoności kodu, a także od poziomu umiejętności programisty C / C ++ i od zrozumienia, co mają zaimplementować - im lepsze i im lepiej rozumieją problem, tym bardziej niezależnie mogą pracować.
Ponieważ bezpośrednie tłumaczenie kodu Matlab na C / C ++ może nie być najskuteczniejszym sposobem radzenia sobie z problemem, sugeruję, abyś dobrze komunikował, co to jest wejście, co powinien zrobić kod i co powinien zwrócić jako wynik. Powinieneś także podać sposoby przetestowania kodu, aby upewnić się, że działa poprawnie - zarówno jako pomoc w debugowaniu, jak i jako środek kontroli jakości. Ponadto powinieneś podać i wyjaśnić kod Matlab jako przybliżoną wytyczną, w jaki sposób można osiągnąć wynik.
Powinieneś być w stanie założyć, że programista wie, jak zbudować program i jak korzystać z narzędzi do debugowania. Jednak niekoniecznie możesz założyć, że programista wie, jak posiadać określoną wiedzę, powiedzmy statystyki lub optymalizację (matematyczną). W związku z tym debugowanie tych części będzie znacznie szybsze po wprowadzeniu danych.
Może pomóc zaplanować regularne spotkania z programistą, aby „małe rzeczy”, które mogą wydawać się nieco dziwne dla programisty, ale które zasygnalizują ważne problemy, mogą zostać przekazane, zanim przerodzą się w duże problemy.
źródło
Nie twierdzę, że dotyczy to ciebie, ale: Większość ludzi, którzy kodują tylko w MATLAB, pisze zły kod. Bardzo źle, ze słabym formatowaniem, strukturą i dokumentacją.
W takim przypadku jedynym łatwym sposobem na użycie kodu MATLAB jest uruchomienie go w celu weryfikacji wyników z przeniesionego kodu. Próba odtworzenia kodu MATLAB bez dodatkowej dokumentacji jest czymś, co należy podjąć tylko wtedy, gdy oryginalny autor kodu MATLAB nie żyje lub jest w śpiączce. Z drugiej strony dobrze napisany artykuł matematyczny na temat algorytmu jest zwykle o wiele bardziej pomocny niż własna implementacja doktoranta.
Aby ułatwić osobie przenoszącej Twój kod:
Zmodyfikuj kod, aby upewnić się, że operacje są podzielone na różne funkcje. Styl MATLAB typu „jedna funkcja na plik” powoduje, że funkcje są zbyt długie i obejmują zbyt wiele operacji. Upewnij się również, że zduplikowany kod jest wyciągany do funkcji pomocniczych, nawet jeśli spowoduje to powstanie większej liczby plików, niż normalnie chciałbyś pracować dla projektu MATLAB.
Wyjaśnij wszystkie magiczne liczby lub stałe użyte w kodzie oraz warunki, w których są one ważne.
Dokumentuj struktury danych swojego kodu. Styl „wszystko jest matrycą” w MATLAB-ie jest bardzo różny od większości języków i często oznacza, że struktury danych są zdefiniowane pośrednio przez sposób korzystania z macierzy. Programista AC będzie musiał dowiedzieć się, jak skonfigurować różne struktury i przydzielić niezbędne tablice, więc upewnij się, że jasne jest, jakie znaczenie i struktury wewnętrzne mają twoje zmienne.
Udokumentuj algorytmy używane w kodzie. W szczególności upewnij się, że jasne jest, co się dzieje, gdy używasz skomplikowanych funkcji i operatorów z całą tablicą, i upewnij się, że programista C ma dostęp do referencji na temat algorytmów używanych przez dowolne funkcje przybornika lub standardowe funkcje biblioteki, które są bardziej skomplikowane niż Funkcje BLAS.
Dokumentuj wszystko, co zrobiłeś, aby kod był niezawodny, na przykład sprawdzanie poprawności danych wejściowych i obsługę błędów. Sposób, w jaki go zaimplementowałeś, jest prawdopodobnie bardzo różny od tego, jak trzeba to zrobić w C. Naukowcy piszący kod MATLAB rzadko zadają sobie trud, aby dowiedzieć się czegoś takiego jak obsługa wyjątków. Jeśli nie zrobiłeś nic, aby Twój kod był niezawodny, to przynajmniej udokumentuj, co można zrobić z nieprawidłowymi danymi wejściowymi, błędnymi lub częściowymi danymi.
Upewnij się, że osoba przenosząca kod jest w stanie porównać dane wyjściowe z oryginalnym kodem MATLAB i, jeśli to możliwe, zapewnić dokładny zestaw danych wejściowych i poprawne dane wyjściowe.
Jeśli osoba dokonująca przenoszenia nie zna analizy numerycznej, musisz nadzorować proces przenoszenia i upewnić się, że przejrzałeś i rozumiesz kod C. Będzie to bardzo edukacyjne dla was obojga.
źródło
Języki programowania są znacznie łatwiejsze do odczytania niż do pisania. Większość programistów C z odrobiną doświadczenia powinna być w stanie dobrze odczytać kod Matlab z dostępem do referencji, a zwłaszcza z dostępem do programisty Matlab, aby odpowiedzieć na ich pytania. Kod jakiegokolwiek rodzaju jest znacznie mniej dwuznaczny niż większość wymagań, z których musimy skorzystać.
Jeśli mają licencjat z informatyki lub inżynierii komputerowej, prawdopodobnie wezmą rachunek różniczkowy, trygonometryczny i algebrę liniową, ale może być zardzewiały. O ile nie zajmują się dużo programowaniem naukowym / matematycznym, większość programistów C będzie wiedziała, czym jest FFT, ale rzadko lub nigdy nie musiała tego robić. Twój idealny kandydat będzie miał wszystko na uwadze, ale każdy, kto ukończył studia, powinien być w stanie poradzić sobie z matematyką dzięki nowemu studium. W obu przypadkach chcesz kogoś, kto kładzie nacisk na szukanie istniejących bibliotek dla typowych operacji, gdy tylko jest to możliwe, zamiast rozwijania własnych.
Talent do optymalizacji czasu wykonywania algorytmu różni się znacznie, nawet wśród doświadczonych programistów. Polecam mieć problem z rozmową kwalifikacyjną, aby to odkryć. Pokaż kandydatom prosty, ale celowo nieefektywny algorytm i zapytaj ich, co robi. Sprawdź, czy sami podnoszą jego nieskuteczność. Zapytaj ich, jaka jest asymptotyczna złożoność i jaka powinna być. Zapytaj ich, w jaki sposób przepisali by poprawić wydajność.
źródło
Finansowy powód nieużywania kompilatora Matlab jest dobrze zrozumiały. Możesz jednak użyć bezpłatnego konwertera scilab na C. Procedura byłaby
Idealnie nie jest wymagana znajomość Scilab w tym procesie i wystarczy poświęcić trochę czasu na wypróbowanie tego rozwiązania (w praktyce może nie jest to takie proste ...)
Uwaga: nie próbowałem tego, ale przewiduję rozwiązanie z podobnych powodów.
źródło
Opracuj dobry zestaw testowy, który można uruchomić w obu aplikacjach, a następnie spójrz na metryki.
Pomoże to deweloperowi przetestować kod i zapewni, że jakość jest na rozsądnym poziomie.
źródło
Świetny post Jonasa, zwłaszcza punkt na zapewnienie sposobu przetestowania kodu. Oto kilka dodatkowych sugestii:
Kod udostępniania Zastanów się nad udostępnieniem źródła MATLAB, ale bądź przygotowany na wyjaśnienie jego struktury lub innych szczegółów (od składni do osobistego stylu). Miejmy nadzieję, że programista C rozpozna koncepcje, algorytmy i matematykę wysokiego poziomu ( i mam nadzieję, że skomentowałeś swój kod ).
Dokumentacja. Bardzo ważne będzie posiadanie przejrzystej dokumentacji określającej projekt; w końcu jeśli dana osoba nie mówi płynnie w MATLAB, kod może nie być bardzo użytecznym odniesieniem.
Ćwicz umiejętności ludzi. Może to być oczywiste, jednak warto o tym pamiętać podczas współpracy, szczególnie na tego rodzaju poziomie mikro. Powinieneś więc spróbować usunąć jak najwięcej niejasności z twojego kodu / dokumentacji. W zależności od poziomu przywództwa w projekcie może się okazać, że osiągasz równowagę między kierowaniem rozwojem a pozwoleniem osobie na wniesienie własnego wkładu.
źródło
O ile kodery C nie używają odpowiednich bibliotek, Matlab jest znacznie lepszy w tak trywialnych sprawach jak odwracanie macierzy. Naiwny C impl. nie jest wystarczająco stabilny. Wynajem koderów C byłby kosztowny. Spróbowałbym przenieść kod Matlaba do scipy i porównać prędkość, spróbować użyć kompilatora c Matlaba lub ... po prostu wrzucić do niego więcej sprzętu - może być o wiele tańszy, prostszy, bezpieczniejszy i szybszy.
źródło