У меня есть много кода MATLAB, который нужно перенести на C (скорость выполнения является критически важным для этой работы) как часть внутреннего процесса для веб-приложения. Когда я пытаюсь передать этот код стороннему разработчику C, я предполагаю (поправьте меня, если я ошибаюсь), немногие разработчики C также понимают код MATLAB (такие вещи, как индексация и управление памятью различны и т. Д.). Интересно, есть ли разработчики C, которые могут порекомендовать мне процедуру, чтобы лучше понять, что делает код?
Например, я должен предоставить код MATLAB и объяснить, что он делает построчно? Или, если я просто предоставлю математику / алгоритм, объясню это простым английским языком и позволю разработчику C реализовать его с этим пониманием по-своему (например, могу ли я предположить, что разработчик понимает, как работать со сложной математикой (то есть воображаемым) цифры), как генерировать гистограммы, выполнять БПФ и т. д.)?
Или есть лучший метод? Я ожидаю, что я не первый, кто должен сделать это, поэтому мне интересно, сталкивались ли какие-либо разработчики C там с этой ситуацией и могли бы поделиться какой-либо общепринятой мудростью, как они хотели бы, чтобы эта задача была передана?
Заранее спасибо за любые комментарии.
mcc -c matlabfile.m
Ответы:
Я нахожусь в той же ситуации, что и вы, у меня также есть люди, портирующие мой код Matlab на C ++.
Многое зависит от сложности вашего кода, а также от уровня квалификации разработчика C / C ++ и их понимания того, что они должны реализовать - чем они лучше и чем лучше они понимают вашу проблему, тем больше самостоятельно они могут работать.
Поскольку прямой перевод кода Matlab на C / C ++, возможно, не самый эффективный способ решения проблемы, я предлагаю вам хорошо сообщить, что представляет собой ввод, что должен делать код и что он должен возвращать в качестве вывода. Вы также должны предоставить способы тестирования кода, чтобы убедиться, что он работает правильно - как в помощь при отладке, так и в качестве средства контроля качества. Кроме того, вы должны предоставить и объяснить код Matlab в качестве приблизительного ориентира того, как можно достичь результата.
Вы должны быть в состоянии предположить, что разработчик знает, как структурировать программу и как использовать инструменты отладки. Однако вы не обязательно можете предполагать, что разработчик знает, как получить конкретные знания, например, в области статистики или (математической) оптимизации. Таким образом, отладка этих частей будет намного быстрее с вашим вводом.
Это может помочь запланировать регулярные встречи с разработчиком, так что «мелочи», которые могут показаться немного странными для разработчика, но которые будут сигнализировать вам о важных проблемах, могут быть переданы до того, как они перерастут в большие проблемы.
источник
Я не говорю, что это относится к вам, но: большинство людей, которые пишут только в MATLAB, пишут плохой код. Очень плохо, с плохим форматированием, структурой и документацией.
В этом случае единственный простой способ использовать код MATLAB - запустить его для проверки результатов из перенесенного кода. Попытка перепроектировать код MATLAB без дополнительной документации - это то, что должно быть предпринято только в том случае, если первоначальный автор кода MATLAB фактически мертв или находится в коматозном состоянии. С другой стороны, хорошо написанная математическая статья об алгоритме обычно намного более полезна, чем собственная реализация аспиранта автора.
Чтобы было проще для человека, переносящего ваш код:
Рефакторинг вашего кода, чтобы убедиться, что операции разбиты на различные функции. Стиль MATLAB «одна функция на файл» позволяет использовать функции слишком длинными и включать слишком много операций. Также убедитесь, что дублированный код извлекается для вспомогательных функций, даже если это приводит к большему количеству файлов, чем вы обычно хотели бы работать для проекта MATLAB.
Объясните любые магические числа или константы, используемые в вашем коде, и условия, при которых они действительны.
Документируйте структуры данных вашего кода. Стиль MATLAB «все является матрицей» сильно отличается от большинства языков, и это часто означает, что ваши структуры данных неявно определяются тем, как вы используете матрицы. Программисту переменного тока нужно будет выяснить, как настроить различные структуры и распределить необходимые массивы, поэтому убедитесь, что вам ясно, каковы значения и внутренние структуры ваших переменных.
Документируйте алгоритмы, используемые вашим кодом. В частности, убедитесь, что ясно, что происходит, когда вы используете сложные функции и операторы целого массива, и убедитесь, что у программиста C есть доступ к ссылкам на алгоритмы, используемые любыми функциями панели инструментов или стандартными функциями библиотеки, которые являются более сложными, чем BLAS функции.
Документируйте все, что вы сделали, чтобы сделать код устойчивым, например, проверку ввода и обработку ошибок. То, как вы это реализовали, вероятно, сильно отличается от того, как это должно быть сделано в C. Академики, пишущие код MATLAB, редко пытаются узнать о таких вещах, как обработка исключений. Если вы ничего не сделали для того, чтобы сделать свой код устойчивым, то хотя бы документируйте, что можно сделать с неверным вводом, некорректными или частичными данными.
Убедитесь, что лицо, переносящее код, может сравнить вывод с исходным кодом MATLAB и, если это вообще возможно, предоставить полный набор тестов для ввода и правильного вывода.
Если человек, выполняющий портирование, не знает числового анализа, вам нужно будет контролировать процесс портирования и убедиться, что вы просматриваете и понимаете код Си. Это будет очень познавательно для вас обоих.
источник
Языки программирования гораздо легче читать, чем писать. Большинство программистов на C, обладающих небольшим опытом, должны быть в состоянии прочитать ваш код Matlab очень хорошо с доступом к справке, и особенно с доступом к программисту Matlab, чтобы ответить на их вопросы. Код любого рода гораздо менее неоднозначен, чем большинство требований, над которыми мы должны работать.
Если они имеют степень бакалавра в области компьютерных наук или компьютерной инженерии, они, вероятно, взяли исчисление, тригонометрию и линейную алгебру, но это может быть ржавым. Если они не занимаются научным / математическим программированием, большинство программистов на Си будут знать, что такое БПФ, но редко или никогда не должны были это делать. Ваш идеальный кандидат будет иметь все это свежее в голове, но любой со степенью должен быть в состоянии справиться с математикой с некоторой переподготовкой. В любом случае вам нужен кто-то, кто делает акцент на поиске существующих библиотек для подобных операций, когда это возможно, а не накатывает свои собственные.
Способность оптимизировать время выполнения алгоритма широко варьируется даже среди опытных программистов. Я бы порекомендовал вам проблему с собеседованием, чтобы узнать это. Покажите кандидатам простой, но намеренно неэффективный алгоритм и спросите его, что он делает. Посмотрите, не поднимут ли они его неэффективность самостоятельно. Спросите их, что такое асимптотическая сложность и какой она должна быть. Спросите их, как бы они переписали для повышения эффективности.
источник
Финансовая причина отказа от использования компилятора Matlab вполне понятна. Тем не менее, вы можете использовать бесплатный конвертер scilab в C. Процедура будет
В идеале в этом процессе не требуется знание Scilab, и достаточно просто потратить некоторое время, чтобы попробовать это решение (на практике это может быть не так просто ...)
Примечание: я не пробовал это, но это решение, которое я представляю себе по тем же причинам.
источник
Разработав хороший набор тестов, вы можете запустить оба приложения, а затем взглянуть на показатели.
Это поможет вашему разработчику протестировать свой код и убедиться, что качество находится на приемлемом уровне.
источник
Отличный пост от Jonas, особенно о том, как предоставить способ тестирования кода. Вот несколько дополнительных предложений:
Код обмена. Подумайте над предоставлением исходного кода MATLAB, но будьте готовы объяснить его структуру или другие детали (от синтаксиса до вашего личного стиля). Мы надеемся, что разработчик C распознает высокоуровневые концепции, алгоритмы и математику ( и, надеюсь, вы прокомментировали свой код ).
Документация. Крайне важно, чтобы у вас была четкая документация, определяющая проект; в конце концов, если человек не владеет MATLAB, код может быть не очень полезной ссылкой.
Упражнение Люди Навыки. Это может быть очевидно, однако, следует помнить о сотрудничестве, особенно на такого рода микроуровне. Поэтому вы должны попытаться устранить как можно больше двусмысленности в своем коде / документации. В зависимости от вашего уровня лидерства в проекте, вы можете обнаружить, что соблюдаете баланс между направлением развития и предоставлением человеку возможности вносить свой личный вклад.
источник
Если ваши C-кодеры не используют правильные библиотеки, Matlab будет намного лучше в таких простых вещах, как инвертирование матрицы. Наивный С импл. недостаточно стабильный Нанимать кодеров C было бы дорого. Я бы попытался перенести код Matlab на scipy и сравнить скорость, попробовать использовать компилятор Matlab c или ... просто добавить больше оборудования - это может быть намного дешевле, проще, безопаснее и быстрее.
источник