45

将来これを読む人々のためのいくつかの背景(ロックされていない場合)。私は最初に問題を理解するために高級言語でプログラミングを行う傾向があります。考えられるすべてのコーナーケースをカバーした後、コードをC ++(またはC)に変換します。

私が書いたコードのほとんどには数学が含まれているので、MATLABが私が使用する言語です(私にとっての代替はPythonです)。とにかく、次にコードをMATLABからC++に手動で変換します。

MATLAB Coderを使用することに長所/短所があるかどうか誰かが知っていますか?これは新製品であり、非常に高価ですが、翻訳で節約できる時間以外に、他に利点はありますか?

4

6 に答える 6

47

免責事項

これは、ある特定のプロジェクトに対する私の経験に基づく非常に独断的な投稿です。私はコーダーの最新バージョンを使用していませんが、以前の Real Time Workshop 製品の一部として含まれていた、matlab コードを C++ に変換するための同等の製品 (組み込みコーダー) の経験があります。これらのコメントは引き続き適用されます。あなたのマイレージは異なる場合があります。

早期特典・・・

私の状況では、エンベデッド コーダーを使用して、より大きなオーディオ アプリケーションの一部に収まる処理ブロックを作成しました。処理ブロックには、サンプル バッファーの一定のストリームをリアルタイムで処理する役割がありました。元のアルゴリズムは matlab で作成しました。変換ツールを使用すると、初期のプロトタイプを、ネイティブ コードにコンパイルしてリアルタイム アプリケーションで使用できるものに変換することがかなり簡単になりました。また、変換されたコードが数値的に元のコードと同じように機能し、変換プロセスで人為的エラーが発生する可能性がなかった (Mahworks エンジニアの超人的な能力を前提として) と仮定したのも良かったです。

この非常に初期のプロトタイピング段階の後、メリットはなくなりました...

問題 1: インターフェースの無駄遣い

アルゴリズムが複雑になるにつれて、変換後に C++ フレームワークとのインターフェイスが簡単になるように、matlab インターフェイスを関数にコーディングする方法についてますます心配するようになりました (内部状態をリアルタイムで監視したかった)。 . これは最終的に、実際のアルゴリズム開発自体と同じくらい多くの時間を費やすようになり、そのようなツールを使用する目的を無効にしました。アルゴリズムを小さなチャンクに分割し、C++ を使用してそれらを接着することもできましたが、完全なアルゴリズムを直接 Matlab のみで比較する機能が失われてしまいます。

問題 2: すべての機能がサポートされていないか、完全にサポートされているわけではありません

コーダーは、Matlab 言語のサブセットをサポートしています。場合によっては、サポートされる機能が何らかの形で制限されます。たとえば、私が取り組んでいたアプリケーションでは、フィルターの特性をリアルタイムで変更できるようにしたいと考えていました。標準の Matlab フィルター プロトタイピング関数を使用できませんでした。これは、コード生成ツールが可変引数を使用したフィルター プロトタイピング関数の呼び出しを許可しないためです。信号処理ツールボックスのライセンスを持っているにもかかわらず、私は自分自身の実装を開発する DSP の本に時間を費やすことになりました。

問題 3: 自動生成されたコードは非効率的だった

インターフェイスの問題に不満を感じ、アルゴリズムを C++ で手作業でコーディングしました。私のアプリケーションでは、変換されたコードよりも手書きのコードの方が 75% パフォーマンスが向上しました。パフォーマンスの違いは、アプリケーション、おそらく使用する変換ツールのバージョン、およびプロファイラーの好みによって大きく異なります。変換ツール自体は、学ぶべき設定がたくさんある複雑な製品です。パフォーマンスを向上させるために設定と matlab コードを微調整する方法を考えようとすると、ハンド コーディングに費やすことができるより多くの時間がかかります。

それ以来、変換ツールを使用していません...

私は今、よりテスト支援のアプローチを好みます。私は Matlab でプロトタイプをコーディングし、希望どおりに動作することが確実になるまで微調整します。次に、C++ で考え、その言語にとってより自然な方法でアルゴリズムを再コーディングします。次に、C++ コードとインターフェイスする mex ファイルを作成して、信頼できる同等の matlab に対してテストできるようにします。私が取り組んでいる問題領域では、これは (人間と機械の) はるかに効率的な方法で物事を成し遂げることができます。

結論として、これは 1 人のユーザーの意見です。おそらく (元の投稿へのコメントで提案されているように) 試用版にサインアップして、どのようにうまくやっていくかを確認する必要があります. ただし、C++ に少し慣れている場合は、mex ファイルをビルドしてテストすることで、アドオン製品の高価なライセンスを必要とせず、優れた開発者になることができます。

于 2012-06-07T23:52:21.510 に答える
2

MATLABで記述しやすい場合、値は時間をどれだけ重視するかに大きく依存します。

パフォーマンスのためにMATLABとCまたはC++を比較することは非常に複雑です。ほとんどの場合、CまたはC ++の方が高速になりますが、一部の線形代数アプリケーションでは、MATLABが最速で実行される可能性があります。私は、MATLABの同等のアプリケーションよりも実行速度が遅いFORTRANアプリケーションがあると主張した教授を覚えています。これには多くのケーススタディがあります-グーグルで現れる速度を比較するさまざまな研究を見て、あなたが決定を下すために行っていることとそれらを比較することをお勧めします。

于 2012-06-07T22:48:07.643 に答える
0

上で述べたように、それはあなたのアプリケーションに依存します。(通信システムの)デコーダーを変換しようとしましたが、正確な結果が得られますが、ビット数が多い場合、独自のMATLABバージョンよりも遅くなります。したがって、私の結論は、手動で MATLAB コードを C に変換することでした。

于 2016-09-29T16:34:00.167 に答える
-1

MATLABには、通常のCコーディングに比べて多くの制限があると思います。直接使用できる組み込みブロックが非常に多いことに同意しますが、MATLABでコードを記述した場合、変数の定義からループの取得、ケースの切り替えまで、非常に時間がかかるため、Cコードと比較して約5倍の時間がかかります。 MATLABモデリングで

また、Simulinkを使用してモデルを作成したと仮定しますが、何かを追加しようとすると、非常に時間がかかりますが、Cではわずか2分のタスクです。

次の問題は、他のプログラミング言語のようにモデルの一部をコメントアウトできないことです。

大規模なプロジェクトの場合、MATLABがクラッシュしたり、破損したり、ハングしたり、stateflowでのシミュレーションがsh*tのようになることがあります。

最後に、忍耐力が十分にある場合にのみ、MATLABモデリング(stateflow + simulink)を使用することを1つだけ言います。

于 2012-10-07T09:46:04.180 に答える
-1

アドバンテージ:

  1. 多くの複雑な数学関数が利用可能です。
  2. ハードコア数学プログラミング関連。

不利益:

  1. C#、java、python などの他の現代的な言語と比較して人気がありません。あなたはそれに名前を付けます。
  2. あなたは matlab をコーディングしているので、複雑な数学の問題を解くことに主に集中する傾向があります。別の言語も、描画、Web 開発、数学などのさまざまなタスクで使用されます (確かに、matlab のような豊富な数学関数はありません)。

私が知っているもう 1 つの利点: テクニカル プログラミング用に最適化されているため、この分野でアプリケーションを作成するときのパフォーマンスが向上する可能性があります。パフォーマンスは非常に信頼できます。この質問を見てください。役立つ情報が提供されます。

于 2012-06-07T22:53:23.593 に答える