科学/エンジニアリングプログラミングをC開発者に伝える推奨方法はありますか?


16

Webアプリケーションのバックエンドプロセスの一部として、Cに移植する必要がある多くのMATLABコードがあります(この作業には実行速度が重要です)。このコードをC開発者にアウトソースしようとするとき、MATLABコードを理解しているC開発者はほとんどいないと思います(間違っている場合は修正してください)(インデックス作成やメモリ管理などは異なります)。コードが何をするのかを最もよく伝えるために私が従うべき手順を推奨できるC開発者がいるのだろうか?

たとえば、MATLABコードを提供し、行ごとに何をしているのかを説明する必要がありますか?または、数学/アルゴリズムを提供し、平易な英語で説明し、C開発者にこの理解を独自の方法で実装させます(たとえば、開発者が複雑な数学の操作方法を理解していると仮定できますか(想像上の数値)、ヒストグラムの生成方法、FFTの実行方法など)?

または、より良い方法はありますか?これを行う必要があるのは私が最初ではないことを期待しているので、そこにいるC開発者がこの状況に陥り、このタスクをどのように転送したいのか、従来の知恵を共有できますか?

コメントを事前に感謝します。


3
mccを使用してmatlabコードをcに変換しようとしましたか?私はそれを考えるmcc -c matlabfile.m
テイトし

4
プログラマーを雇うとき、C / Matlabコードの両方を理解する必要があることを指定します。ただし、速度を重視する場合は、おそらくCではなくC ++を使用する必要があります(多少の注意を払って、決して遅くなることはなく、多くの場合は高速になります)。
ジェリーコフィン

3
@willytate:これには、Matlabコンパイラーが必要です。特に効率的なコードは生成されません。また、コンパイルできるコードにはいくつかの制限があります。
ジョナス

3
Cでオブジェクト指向のプログラミングを行う場合、コンパイラに追加の型安全性チェックを行わせる機会を奪うだけでなく、簡単に表現できない特定の種類の最適化を行う機会をコンパイラから奪います。また、C ++を使用すると、自分よりも賢い誰かが作成したライブラリの機能を使用できる可能性が高くなります。

3
ほとんどの時間は実際のアルゴリズムに費やされていますか、それともファイル、IO、および解析をいじっていますか?平均的なCコーダーは、MATLAB実装と競合するところのどこにでも来るFFTおよび行列コードを書くことができません。解析、IO、およびファイルのいじりがプログラムの時間を費やす場所である場合、Cプログラマーはそれに集中し、MATLABライブラリから関数を呼び出すグルーコードを記述する必要があります。FFT /行列分解/ ODE解法がボトルネックである場合、数値的手法の経験が豊富なCプログラマを見つける必要があります。
チャールズE.グラント

回答:


15

MatlabコードをC ++に移植する人もいるという点で、私はあなたと同じような状況にあります。

多くは、コードの複雑さ、C / C ++開発者のスキルのレベル、および実装するものの理解度に依存します-それらがより良く、あなたの問題をよりよく理解するほど、独立して、彼らは働くことができます。

MatlabコードをC / C ++に直接変換することは、問題を処理する最も効率的な方法ではない可能性があるため、入力が何であるか、コードが何をすべきか、出力として返されるはずの内容をよく伝えることをお勧めします。また、デバッグの助けとしてだけでなく、品質管理の手段を提供するためにも、コードが正しく機能することを確認するためのコードをテストする方法を提供する必要があります。さらに、Matlabコードを提供し、結果を達成する方法の大まかなガイドラインとして説明する必要があります。

開発者がプロ​​グラムの構造化方法とデバッグツールの使用方法を知っていると想定できるはずです。ただし、開発者が統計や(数学)最適化などの特定の知識をどのように持っているかを必ずしも知っているとは限りません。したがって、これらの部分のデバッグは、入力を使用するとはるかに高速になります。

開発者との定期的な会議をスケジュールすると、開発者にとって少し奇妙に感じるかもしれないが、重要な問題を知らせる「小さなこと」が大きな問題にエスカレートする前に伝えられるようになります。


+1は、ソフトウェアの有効なテスト結果を取得しているため。MatlabからC / C ++へのコードの移植は、結果がどのように見えるかを知らなくても十分に困難です。
rjzii

12

私はこれがあなたに当てはまるとは言っていませんが、MATLABのコードだけを書いているほとんどの人は悪いコードを書いています。書式設定、構造、ドキュメントが不十分で、非常に悪い。

この場合、MATLABコードを使用する唯一の簡単な方法は、MATLABコードを実行して、移植されたコードからの結果を検証することです。追加のドキュメントなしでMATLABコードをリバースエンジニアリングしようとすることは、MATLABコードの元の作成者が実際に死んでいるかat睡している場合にのみ行うべきものです。一方、アルゴリズムに関するよく書かれた数学的論文は、通常、著者の大学院生自身の実装よりもはるかに役立ちます。

コードを移植する人が簡単にできるようにするには:

  1. コードをリファクタリングして、操作が異なる関数に分類されるようにします。MATLABの1ファイルあたり1関数のスタイルは、関数が長すぎて、操作が多すぎることを助長します。また、MATLABプロジェクトで通常使用するよりも多くのファイルが作成される場合でも、重複したコードがヘルパー関数に引き出されていることを確認してください。

  2. コードで使用されているマジックナンバーまたは定数、およびそれらが有効な条件を説明します。

  3. コードのデータ構造を文書化します。MATLABの「すべてはマトリックス」スタイルはほとんどの言語とは非常に異なり、多くの場合、マトリックスの使用方法によってデータ構造が暗黙的に定義されることを意味します。ACプログラマーは、さまざまな構造を設定し、必要な配列を割り当てる方法を把握する必要があるため、変数の意味と内部構造が明確になっていることを確認してください。

  4. コードで使用されるアルゴリズムを文書化します。特に、複雑な配列全体の関数と演算子を使用するとどうなるかが明確であり、Cプログラマーが、ツールボックス関数または標準ライブラリ関数よりも複雑なアルゴリズムに関するリファレンスにアクセスできることを確認してください。 BLAS機能。

  5. 入力検証やエラー処理など、コードを堅牢にするために行ったことを文書化します。実装方法はおそらく、Cで行う方法とは非常に異なります。MATLABコードを記述している学者は、例外処理などのことを学ぶことにほとんど煩わされません。コードを堅牢にするために何も行っていない場合は、少なくとも、無効な入力または欠陥のあるデータまたは部分的なデータについて何ができるかを文書化します。

  6. コードを移植する人が出力を元のMATLABコードと比較できることを確認し、可能な場合は、入力と正しい出力の完全なテストスイートを提供します。

  7. 移植を行う人が数値分析を知らない場合、移植プロセスを監督し、Cコードを確認して理解する必要があります。両方にとって非常に教育的です。


私はあなたの技術的評価に同意し、あなたは良い点(1-7)を作りますが、「MATLABでコーディングするだけのほとんどの人」に関する一番上の広告の名誉は不必要であり、真実ではないと思います。

5
私の経験に基づいて、MATLABを唯一のプログラミング言語として使用している人のほとんどは数学の専門家です。彼らはプログラミングの実践を気にするインセンティブを持たず、良いコードや美しいコードではなく、正しいコードを書くことだけを気にします。彼らがコードを共有するとき、それは通常使用されることを意図されていますが、読まれません-コードを説明する仕事をするための論文が常にあります。これが攻撃的だと思う場合(そしてそうするつもりはない)、気にしない人の視点を単に見逃しているだけです。

4
私の経験では、不良コードは主にワンショットコード、つまり1人の問題に対して1人で使用(読み取り)されるコードを書く人によって書かれています。プログラミング言語は関係ありません。そして、主にMatlabでプログラミングをしている私にとって、広告の名誉は攻撃的だと思います。
ジョナス

EEとして私は主にMATLABを書くことを期待されており、あなたに同意します。これは、スコーピング、ネームスペース、データ構造への編成、または適切な変数命名のない、非常に恐ろしいコーディングスタイルを促進します。ベクトル化が理解されると、結果として得られる巧妙な1行の不思議についてコメントする必要はありません。い非効率的なコードの巨大なごみの山。
Milind R

4

プログラミング言語は、書くよりも読む方がはるかに簡単です。わずかな経験を持つほとんどのCプログラマーは、リファレンスにアクセスして、特に質問に答えるためにMatlabプログラマーにアクセスして、Matlabコードを正常に読み取ることができるはずです。あらゆる種類のコードは、私たちが取り組まなければならないほとんどの要件よりもはるかに曖昧ではありません。

コンピューターサイエンスまたはコンピューターエンジニアリングの学士号を取得している場合は、微積分、三角法、線形代数を取得している可能性がありますが、さびている可能性があります。多くの科学/数学プログラミングを行わない限り、ほとんどのCプログラマーはFFTが何であるかを知っていますが、FFTを実行する必要はほとんどありません。あなたの理想的な候補者は、彼の心にすべてを新鮮に持っていますが、学位を持っている人は、いくつかの復習研究で数学を扱うことができるはずです。どちらの場合でも、自分のローリングではなく、可能な限り、そのような一般的な操作のために既存のライブラリを見つけることを強調する人が必要です。

アルゴリズムの実行時間を最適化できる能力は、経験豊富なプログラマーの間でも大きく異なります。それを発見するために、インタビューの問題があることをお勧めします。候補者に単純だが意図的に非効率的なアルゴリズムを見せ、それが何をするのか尋ねる。彼らが自分でその非効率性を育てるかどうかを確認してください。漸近的複雑性とは何か、またそれがどうあるべきかを尋ねます。効率を改善するためにどのように書き換えるかを尋ねます。


3

matlabコンパイラを使用しない経済的理由は十分に理解できます。ただし、無料のscilab to Cコンバーターを使用できます。手順は

  • M2SCIツールを使用して、MatlabからScilabにコードを変換します。
  • "Scilab 2 C"を使用してScilabコードをCに変換します 。
  • コードをクロステストし、
  • プロファイラーを使用して、人間の目が必要なボトルネックを検索します。

理想的には、プロセスでScilabの知識は不要であり、このソリューションを試してみるのに十分簡単です(実際には、それほど単純ではないかもしれません...)

注:私はこれを試しませんでしたが、同様の理由で自分が考えている解決策です。


2

両方のアプリケーションを実行できる優れたテストセットを開発してから、メトリックを確認します。

これにより、開発者はコードをテストし、品質が適切なレベルにあることを確認できます。


2

Jonasによる素晴らしい投稿、特にコードをテストする方法を提供するポイント。追加の提案を次に示します。

  • 共有コード。MATLABソースの提供を検討しますが、その構造やその他の詳細(構文から個人的なスタイルまで)を説明する準備をしてください。C開発者は、高レベルの概念、アルゴリズム、および数学を理解することを願っていますコードをコメントしたことを願っています)。

  • ドキュメンテーション。プロジェクトを定義する明確なドキュメントを用意することが重要です。結局、もしその人がMATLABに堪能でなければ、そのコードは非常に有用なリファレンスではないかもしれません。

  • 人々のスキルを行使します。これは明らかかもしれませんが、特にこの種のミクロレベルでは、共同作業を行う際に留意することが重要です。したがって、コード/ドキュメントから可能な限りあいまいさを排除するようにしてください。プロジェクトでのリーダーシップのレベルによっては、開発を指導することと、個人が自分で貢献できるようにすることのバランスが取れていることがあります。


1

Cコーダーが適切なライブラリを使用しない限り、Matlabはマトリックスを反転するのと同じくらい些細なことではるかに優れています。素朴なC実装。十分に安定していません。Cのコーダーを雇うと費用がかかります。Matlabコードをscipyに移植して速度を比較したり、Matlabのcコンパイラを使用したり、ハードウェアを追加したりするだけで済みます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.