Matlab Coder против ручного кодирования?

43

Некоторые предпосылки для людей, читающих это в будущем (в случае, если они не заблокированы). Я, как правило, занимаюсь программированием на языке высокого уровня, чтобы сначала понять проблему. После покрытия всех возможных угловых случаев я перехожу к переводу кода на С++ (или C).

Большая часть кода, который я пишу, имеет в нем математику, поэтому MATLAB - это язык, который я использую (альтернатива для меня - Python). Во всяком случае, я затем переводил код с MATLAB на С++ вручную.

Кто-нибудь знает, есть ли какие-либо преимущества/недостатки в использовании MATLAB Coder? Это новый продукт и очень дорогой, но, кроме времени, который он сохраняет в переводе, есть ли какая-нибудь другая польза?

  • 7
    Почему бы вам просто не скачать пробную версию MATLAB Coder, посмотреть, как она работает для вас, и сравнить результаты с предыдущей работой, которую вы сделали?
  • 1
    Как насчет использования языка высокого уровня, с которым приятно работать, но который все же сразу компилируется в быстрый нативный код? Haskell довольно хорош. C ++ 11 тоже не так уж и плох.
Показать ещё 3 комментария
Теги:
matlab-deployment

6 ответов

40
Лучший ответ

Отказ

Это очень упрямый пост, основанный на моем опыте для одного конкретного проекта. Я не использовал последнюю версию кодера, но у меня есть опыт с эквивалентным продуктом (встроенным кодером) для преобразования кода MATLAB в С++, который был включен как часть бывшего продукта Realtime Workshop. Эти комментарии все равно должны применяться. Ваш пробег может отличаться.

Ранние преимущества...

В моей ситуации встроенный кодер использовался для создания блока обработки, который вписывается в часть более крупного аудио приложения. Блок обработки имел задачу обработки постоянного потока буферов выборки в реальном времени. Я сделал оригинальный алгоритм в Matlab, и инструмент преобразования упростил преобразование раннего прототипа во что-то, что можно было скомпилировать в собственный код и использовать в приложении реального времени. Было также приятно предположить, что преобразованный код функционировал в цифровой форме идентично оригиналу без возможности человеческой ошибки в процессе преобразования (предполагая сверхчеловеческие способности инженеров Mahworks).

Преимущества, достигнутые после этой очень ранней стадии прототипирования...

Проблема 1: Интерфейс времени

По мере усложнения алгоритма я начал все больше беспокоиться о том, как закодировать интерфейс Matlab для функции, чтобы после преобразования было легко взаимодействовать с каркасом С++ (я хотел контролировать внутренние состояния в в реальном времени). Это в конечном итоге начало использовать как можно больше времени, чем сама разработка самого алгоритма, тем самым побеждая цель использования такого инструмента. Я мог бы сломать алгоритм на более мелкие куски, а затем склеить их вместе с помощью С++, но тогда я потеряю способность иметь прямое сравнение Matlab полного алгоритма.

Проблема 2: не все функции поддерживаются или поддерживаются полностью

Кодер поддерживает подмножество языка Matlab. В некоторых случаях поддерживаемые функции каким-то образом ограничены. Например, в приложении, над которым я работал, я хотел иметь возможность изменять характеристики фильтра в режиме реального времени. Я не мог использовать стандартные функции прототипирования фильтров Matlab, потому что инструмент генерации кода не разрешал вызовы функции прототипирования фильтра с переменными аргументами. Я закончил тем, что проводил время с помощью книги DSP, разрабатывающей мою собственную реализацию, хотя у нас есть лицензия на обработку сигналов.

Проблема 3: Автоматически сгенерированный код был неэффективен

Я расстроился с проблемами интерфейса и закодировал алгоритм вручную на С++. Для моего приложения было повышение производительности на 75% в пользу написанного вручную кода по преобразованному коду. Различия в производительности будут сильно различаться в зависимости от вашего приложения, возможно, от версии используемого инструмента преобразования и вашей привязанности вашего профилировщика. Инструмент преобразования сам по себе является сложным продуктом, который имеет множество настроек для изучения. Пытаясь решить, как настроить настройки, а код matlab для повышения производительности использует больше времени, которое можно потратить на ручное кодирование.

Я не использовал инструмент преобразования, поскольку...

Теперь я предпочитаю более тесный подход. Я кодирую прототип в Matlab и настраиваю, пока не уверен, что он ведет себя так же, как и я. Затем я думаю на С++ и перекодирую алгоритм таким образом, который более естественен для этого языка. Затем я создаю файл mex, который взаимодействует с моим кодом на С++, поэтому я могу протестировать его против моего доверенного эквивалента matlab. Для проблемного пространства, в котором я работаю, это гораздо более эффективный (человеческий и машинный) способ сделать все возможное.

В заключение, это всего лишь мнение одного пользователя. Возможно (как указано в комментарии к вашему оригинальному сообщению), вы должны зарегистрироваться в суде, чтобы увидеть, как вы ладите. Однако, если вы немного С++-ниндзя, тестирование при создании mex файлов не требует дорогостоящей лицензии для дополнительного продукта, и это сделает вас лучшим разработчиком.

  • 1
    «Тестирование», как вы это называете, является стандартной практикой. Сохраните исходный код Matlab для нерегрессионного тестирования, и у вас будет хороший и эффективный рабочий процесс.
2

Если вам легче писать в MATLAB, значение будет сильно зависеть от того, насколько вы цените свое время.

Сравнение MATLAB и C или С++ для производительности очень сложно. C или С++ в большинстве случаев будут быстрее, но в некоторых приложениях с линейной алгеброй возможно, что MATLAB выполнит самый быстрый. Я помню профессора, который утверждал, что у него были приложения FORTRAN, которые работали медленнее, чем эквивалент в MATLAB. В этом есть много примеров: я бы рекомендовал вам посмотреть на различные исследования, сравнивающие скорость, которая появляется в Google, и сравнить их с тем, что вы делаете, чтобы принять решение.

  • 0
    Я не думаю, что он спрашивает, стоит ли переходить с MATLAB на C, но какой подход лучше?
1

Это все о процессе.

Там, где я работаю, мы разработали хорошую схему управления для наших моделей Simulink и их зависимостей. Затем я разработал сценарий для перехода к этапу автокодирования, а коллега разработал файлы проекта в IDE, чтобы при запуске моего сценария все исходные файлы отправлялись в правильную структуру папок, и проект можно было легко скомпилировать в IDE. где кто-то еще также развернул код-обертку для взаимодействия с программным обеспечением с автоматическим кодированием.

Хитрость (ИМХО) заключается в том, чтобы максимально автоматизировать ваш процесс как можно раньше. Делая это, вы можете за пару часов разработать очень сложные модели и их создание кода на C для производства. И вы можете обновлять модели по своему усмотрению, но код легко поддерживать.

Недостатком является то, что настройка этого процесса не является ни тривиальной, ни полностью общей (один размер не подходит большинству).

Кроме того, вам следует провести некоторое тестирование, чтобы убедиться, что сгенерированный код действительно представляет модель, которую вы имели. Это не гарантировано, и хотя я думаю, что Matlab Coder довольно надежен, он не безошибочен.

0

Как было сказано выше, это зависит от приложения ur. Я попытался преобразовать декодер (системы связи), он дает точные результаты, но для большого количества бит он медленнее, чем его собственная версия MATLAB. Поэтому я пришел к выводу, что код MATLAB конвертируется вручную.

0

Я думаю, что MATLAB имеет множество ограничений по сравнению с обычным C-кодированием. Я согласен, что существует так много встроенных блоков, которые могут быть использованы напрямую, но если вы напишете код в MATLAB, то это займет почти 5 раз дольше по сравнению с C-кодом, потому что от определения переменных до принятия циклов, случаев переключения, его очень много времени в моделировании MATLAB

И предположим, что вы создали модель с помощью Simulink, но когда вы пытаетесь добавить что-то, то снова это очень трудоемко, но в C это всего лишь 2-минутная задача.

Следующая проблема заключается в том, что вы не можете комментировать любую часть модели, как в других языках программирования.

Для большого проекта иногда MATLAB разбивается, корректируется, иногда зависает, а симуляция в stateflow похожа на sh * t.

В конце я просто говорю одно: использование MATLAB-моделирования (stateflow + simulink), только если у вас много терпения.

0

Преимущество:

  • Доступны множество сложных математических функций.
  • Для программирования математического программирования hardcore.

Неудобство:

  • Он не популярен по сравнению с другими современными языками, такими как С#, java, python. вы называете это.
  • Поскольку вы кодируете Matlab, вы, как правило, фокусируетесь в основном на решении сложных математических задач. Другие языки используются в разнообразных задачах: от рисования, веб-разработки и математики (он не имеет богатых математических функций, таких как matlab).

Еще одно преимущество, которое я знаю: поскольку он оптимизирован для технического программирования, у вас может быть более высокая производительность при написании приложения в этом поле. Производительность очень надежная, взгляните на этот вопрос, она предоставляет некоторую полезную информацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню