2012-06-07 12 views
39

Alcuni sfondi per le persone che leggono questo in futuro (nel caso in cui non sia bloccato). Tendo a fare la mia programmazione in un linguaggio di alto livello per capire prima il problema. Dopo aver coperto tutti i possibili casi d'angolo, procedo alla traduzione del codice in C++ (o C).Codificatore Matlab rispetto alla codifica manuale?

La maggior parte del codice che scrivo contiene matematica e quindi MATLAB è la lingua che uso (l'alternativa per me è Python). Ad ogni modo, poi traduco il codice da MATLAB a C++ a mano.

Qualcuno sa se c'è qualche vantaggio/svantaggio nell'uso di MATLAB Coder? È un nuovo prodotto e molto costoso, ma a parte il tempo risparmiato nella traduzione c'è qualche altro vantaggio?

+7

Perché non basta scaricare la versione di prova di Coder MATLAB, vedere come funziona per te e confrontare i risultati con il lavoro precedente che hai svolto? – mpontes

+0

Che ne dici di usare un linguaggio di alto livello che sia bello lavorare, ma che compaia ancora per il codice nativo veloce, subito? Haskell è abbastanza buono. C++ 11 non è poi così male neanche. – leftaroundabout

+0

Vero, ma Matlab ha molte funzioni integrate che sono molto convenienti. – s5s

risposta

40

responsabilità

Questo è un post molto supponente in base alla mia expirience per un particolare progetto. Non ho usato l'ultima versione del codificatore, ma ho esperienza con il prodotto equivalente (codificatore incorporato) per convertire il codice matlab in C++ che è stato incluso come parte del precedente prodotto Real Time Workshop. Questi commenti dovrebbero ancora essere applicati. Il tuo chilometraggio può variare.

I primi benefici ...

Nella mia situazione, il codificatore incorporato è stato utilizzato per fare un blocco di elaborazione che rientrano in parte di una più ampia applicazione audio. Il blocco di elaborazione aveva il compito di elaborare un flusso costante di buffer di campioni in tempo reale. Ho realizzato l'algoritmo originale in MATLAB e lo strumento di conversione ha reso abbastanza semplice la conversione di un prototipo iniziale in qualcosa che potrebbe essere compilato in codice nativo e utilizzato in un'applicazione in tempo reale.Era anche bello presumere che il codice convertito funzionasse numericamente identicamente all'originale senza possibilità di errore umano nel processo di conversione (assumendo le abilità sovrumane degli ingegneri di Mahworks).

I benefici si è conclusa dopo questa fase di prototipazione molto presto ...

Problema 1: perdere tempo interfacciamento

Come l'algoritmo è cresciuto in complessità, ho cominciato a preoccuparsi sempre di più su come codificare la interfaccia matlab alla funzione in modo tale che dopo la conversione, sarebbe facile interfacciarsi con il framework C++ (volevo monitorare gli stati interni in tempo reale). Questo alla fine ha iniziato ad usare tanto tempo quanto lo sviluppo dell'algoritmo stesso, vanificando così lo scopo di utilizzare tale strumento. Avrei potuto suddividere l'algoritmo in blocchi più piccoli e poi incollarli insieme usando C++, ma poi avrei perso la possibilità di avere un confronto diretto solo con Matlab dell'algoritmo completo.

Problema 2: Non tutte le funzioni sono supportate o supportate pienamente

Il codificatore supporta un subset of the Matlab language. In alcuni casi, le funzioni supportate sono limitate in qualche modo. Ad esempio, nell'applicazione su cui stavo lavorando, volevo essere in grado di modificare le caratteristiche di un filtro in tempo reale. Non ho potuto utilizzare le funzioni standard di prototipazione del filtro Matlab, perché lo strumento di generazione del codice non consentiva chiamate alla funzione di prototipazione del filtro con argomenti variabili. Ho finito col passare del tempo con un libro DSP a sviluppare la mia implementazione, anche se disponevamo di una licenza per strumenti di elaborazione del segnale.

Problema 3: il codice generato automaticamente era inefficiente

ho ottenuto frustrato con i problemi di interfaccia e codificato l'algoritmo a mano in C++. Per la mia applicazione, c'è stato un incremento delle prestazioni del 75% a favore del codice scritto a mano sul codice convertito. Le differenze di prestazioni saranno molto diverse a seconda della tua applicazione, probabilmente della versione dello strumento di conversione utilizzato e della tua passione per il tuo profiler. Lo stesso strumento di conversione è un prodotto complesso con molte impostazioni da apprendere. Cercare di capire come modificare le impostazioni e il codice MATLAB per migliorare le prestazioni richiede più tempo che potrebbe essere dedicato alla codifica manuale.

Non ho usato lo strumento di conversione in quanto ...

ora preferiscono un altro test-approccio assistito. Codigo un prototipo in Matlab e ottimizzo fino a quando sono sicuro che si comporta come lo voglio anch'io. Poi penso in C++ e ricodificato l'algoritmo in un modo che è più naturale di quella lingua. Quindi creo un file mex che si interfaccia con il mio codice C++ in modo da poterlo testare contro il mio equivalente matlab di fiducia. Per lo spazio problematico in cui lavoro, questo è un modo molto più efficiente (umano e automatico) per fare le cose.

In conclusione, questa è solo l'opinione di un utente. Forse (come suggerito in un commento sul tuo post originale) dovresti iscriverti per il processo per vedere come vai d'accordo. Tuttavia, se sei un po 'un ninja C++, il test con la creazione di file mex non richiede una licenza costosa per un prodotto aggiuntivo e ti renderà uno sviluppatore migliore.

+1

"Test assistito" come lo chiami è una pratica standard. Conserva il codice MATLAB originale per i test di non regressione e hai un flusso di lavoro buono ed efficiente. –

2

Se è più facile scrivere in MATLAB, il valore dipenderà molto da quanto si apprezza il tempo.

Il confronto tra MATLAB e C o C++ per le prestazioni è molto complicato. C o C++ saranno più veloci nella maggior parte dei casi, ma in alcune applicazioni di algebra lineare è possibile che MATLAB esegua il più veloce. Ricordo un professore che sosteneva di avere applicazioni FORTRAN più lente rispetto all'equivalente in MATLAB. Ci sono molti casi di studio su questo - ti consiglierei di esaminare i diversi studi confrontando la velocità che si presenta in google e confrontarli con ciò che stai facendo per prendere una decisione.

+0

Non penso che stia chiedendo se valga la pena convertire da MATLAB a C, ma qual è l'approccio migliore. – bakalolo

0

Vantaggio:

  1. Un sacco di funzioni matematiche complesse sono disponibili.
  2. Per la programmazione matematica complessa correlata.

Svantaggio:

  1. E 'non è popolare rispetto ad altri linguaggi moderni come C#, Java, Python. lo chiami.
  2. Dato che si scrive codice matlab, si tende a concentrarsi principalmente sulla risoluzione di problemi complessi di matematica. Un altro lingue sono utilizzati in compiti di varietà dal disegno, sviluppo web e la matematica, nonché (non deve funzioni ricche matematiche come MATLAB di sicuro)

altri benefici che conosco: Dal momento che è ottimizzato per la programmazione tecnica, si può avere prestazioni migliori quando si scrive un'applicazione su questo campo. La performance è molto affidabile, date un'occhiata a questa domanda, fornisce some helpful information.

0

Penso che MATLAB abbia molte limitazioni rispetto alla normale codifica C.Sono d'accordo sul fatto che ci siano così tanti blocchi predefiniti che possono essere usati direttamente, ma se si scrive un codice in MATLAB ci vorranno quasi 5 volte di più rispetto al codice C, perché dalla definizione delle variabili al prendere loop, passare da un caso all'altro, richiede molto tempo in modellazione MATLAB

E supponiamo di aver creato un modello utilizzando Simulink ma quando si tenta di aggiungere qualcosa, di nuovo è molto dispendioso in termini di tempo, ma in C è solo un'attività di 2 minuti.

Il prossimo problema è che non è possibile commentare alcun modello come in altri linguaggi di programmazione.

Per un grande progetto a volte MATLAB si arresta in modo anomalo, corregge, a volte si blocca e la simulazione nello stato è come una sh * t.

Alla fine dico solo una cosa, che usa la modellazione MATLAB (stateflow + simulink) solo se hai molta pazienza.

0

Come è stato detto sopra, dipende dall'applicazione. Ho provato a convertire il decodificatore (di un sistema di comunicazione) che fornisce risultati accurati ma per un numero elevato di bit è più lento della sua versione MATLAB. Quindi la mia conclusione è stata quella di convertire a mano il codice MATLAB in C.