Webアプリケーションのバックエンドプロセスの一部として、Cに移植する必要がある多くのMATLABコード(実行速度はこの作業にとって重要です)があります。このコードをC開発者にアウトソーシングしようとする場合、MATLABコードを理解しているC開発者はほとんどいないと思います(私が間違っていれば訂正してください)(インデックス作成やメモリ管理などが異なるなど)。コードが何をするのかを最もよく伝えるために私が従うべき手順を推奨できるC開発者がそこにいるのだろうか?
たとえば、MATLABコードを提供し、それが行ごとに何をしているのかを説明する必要がありますか?または、数学/アルゴリズムを提供し、それを平易な英語で説明し、Cの開発者にこの理解をもって独自の方法で実装させます(たとえば、開発者が複雑な数学(つまり、想像上の数値)、ヒストグラムの生成方法、FFTの実行方法など)
または、より良い方法はありますか?私がこれを行う必要があるのは私が最初ではないと思います。そのため、Cの開発者がこの状況に遭遇し、このタスクをどのように転送するかについて従来の知識を共有できるかどうか疑問に思いますか?
コメントを事前にありがとう。
私はあなたと同じような状況にありますが、MatlabコードをC++に移植する人もいます。
多くは、コードの複雑さ、およびC/C++開発者のスキルのレベルと、それらが実装することになっているものに対する彼らの理解に依存します-それらが優れていて、問題をよりよく理解しているほど、独立して彼らは働くことができます。
MatlabコードをC/C++に直接変換することは、問題を処理するための最も効率的な方法ではない可能性があるため、入力とは何か、コードで何を実行する必要があるか、出力として何が返されるかをよく伝えることをお勧めします。また、コードをテストしてコードが正しく機能することを確認する方法も提供する必要があります。デバッグの助けとして、また品質管理の手段としても使用できます。さらに、Matlabコードを提供して、結果をどのように達成できるかについての大まかなガイドラインとして説明する必要があります。
開発者がプログラムの構成方法とデバッグツールの使用方法を知っていると想定できるはずです。ただし、開発者が統計や(数学的)最適化などの特定の知識を持つ方法を知っているとは必ずしも想定できない場合があります。したがって、これらのパーツのデバッグは、入力ではるかに高速になります。
開発者との定期的な会議をスケジュールすると、開発者にとって少し変な感じがするかもしれませんが、大きな問題にエスカレートする前に、重要な問題を知らせることができます。
これがあなたに当てはまるとは言っていませんが、MATLABでコーディングするだけのほとんどの人が悪いコードを書いています。フォーマット、構造、ドキュメントが不十分で、非常に悪い。
これが事実である場合、MATLABコードを利用する唯一の簡単な方法は、移植されたコードからの結果を検証するためにそれを実行することです。追加のドキュメンテーションなしでMATLABコードをリバースエンジニアリングしようとすることは、MATLABコードの元の作者が実際に死んでいるか、または昏睡状態である場合にのみ行われるべきものです。一方、アルゴリズムに関するよく書かれた数学的論文は、通常、著者の大学院生自身の実装よりもはるかに役立ちます。
コードの移植を容易にするために:
コードをリファクタリングして、操作がさまざまな関数に分解されるようにします。 MATLABのファイルごとに1つの関数のスタイルでは、関数が長くなりすぎて、非常に多くの操作が含まれることになります。また、重複したコードがヘルパー関数に引き出されていることを確認してください。これにより、MATLABプロジェクトで通常使用するよりも多くのファイルが生成されます。
コードで使用されているマジックナンバーまたは定数と、それらが有効である条件を説明します。
コードのデータ構造を文書化します。 MATLABの「すべてがマトリックスである」スタイルは、ほとんどの言語とは大きく異なり、多くの場合、データ構造はマトリックスの使用方法によって暗黙的に定義されます。 Cプログラマーは、さまざまな構造を設定し、必要な配列を割り当てる方法を理解する必要があります。そのため、変数の意味と内部構造が何であるかを明確にしてください。
コードで使用されるアルゴリズムを文書化します。特に、複雑な配列全体の関数と演算子を使用するとどうなるかを明確にし、Cプログラマーがツールボックス関数または標準ライブラリ関数で使用されているアルゴリズムに関するリファレンスにアクセスできることを確認してください。 BLAS関数。
入力の検証やエラー処理など、コードを堅牢にするために行ったことをすべて文書化します。これを実装した方法は、Cで実行する方法とは非常に異なる可能性があります。MATLABコードを記述しているアカデミックは、例外処理などについて学習する必要がほとんどありません。コードを堅牢にするために何もしていない場合は、少なくとも、無効な入力、欠陥のあるデータ、または部分的なデータについて何ができるかを文書化してください。
コードを移植する人が出力を元のMATLABコードと比較できることを確認し、可能であれば、入力と正しい出力の完全なテストスイートを提供します。
移植を行う人が数値分析を知らない場合は、移植プロセスを監視し、Cコードを確認して理解する必要があります。どちらにとっても非常に教育的です。
プログラミング言語は書くより読む方がはるかに簡単です。経験の浅いほとんどのCプログラマーは、リファレンスへのアクセス権、特に質問に答えるためのMatlabプログラマーへのアクセス権を使用して、Matlabコードを問題なく読み取ることができるはずです。あらゆる種類のコードは、私たちが取り組まなければならないほとんどの要件よりもあいまいさが少なくなっています。
コンピュータサイエンスまたはコンピュータエンジニアリングの学士号を取得している場合は、微積分、三角法、線形代数を取得している可能性がありますが、錆びている可能性があります。多くの科学/数学プログラミングを行わない限り、ほとんどのCプログラマーはFFTが何であるかを知っていますが、FFTを行う必要はほとんどありません。あなたの理想的な候補者は彼の心の中ですべての新鮮さを持っていますが、学位を持つ誰もがいくつかの復習研究で数学を処理することができるはずです。どちらの場合でも、可能な限り、独自のライブラリをローリングするのではなく、そのような一般的な操作のために既存のライブラリを見つけることを強調する人が必要です。
アルゴリズムの実行時間を最適化できる才能は、経験豊富なプログラマの間でも大きく異なります。それを発見するために面接の問題があることをお勧めします。単純だが意図的に非効率的なアルゴリズムを候補者に示し、それが何をするかを尋ねる。彼らが自分たちで非効率をもたらすかどうかを確認します。漸近的な複雑さとは何か、それがどうあるべきかを尋ねます。効率を改善するためにどのように書き換えるかを尋ねます。
Matlabコンパイラーを使用しない金銭的理由はよく理解できます。ただし、無料のscilabからCへのコンバーターを使用できます。手順は
理想的には、プロセスでScilabの知識は必要ありません。少し時間をかけてこのソリューションを試すのは簡単です(実際には、それほど簡単ではないかもしれません...)
注:私はこれを試しませんでしたが、同様の理由で自分が考えている解決策です。
両方のアプリケーションで実行できる優れたテストセットを開発し、メトリックを確認します。
これにより、開発者がコードをテストし、品質が妥当なレベルであることを確認できます。
Jonasによる素晴らしい投稿、特にコードをテストする方法を提供することに関するポイント。追加の提案は次のとおりです。
コードの共有。 MATLABソースの提供を検討しますが、その構造やその他の詳細(構文から個人的なスタイルまで)を説明する準備をしてください。 C開発者は、うまくいけば、高水準の概念、アルゴリズム、および数学を認識できるでしょう(そしてうまくいけば、コードにコメントします)。
Documentation。プロジェクトを定義する明確なドキュメントを用意することが重要です。結局のところ、MATLABに堪能でない場合、コードはあまり有用なリファレンスではない可能性があります。
エクササイズピープルスキルこれは明らかかもしれませんが、特にこの種のマイクロレベルでコラボレーションする場合は注意が必要です。したがって、コード/ドキュメントからできるだけ多くのあいまいさを取り除くようにしてください。プロジェクトでのリーダーシップのレベルに応じて、開発のガイドと個人が個別に貢献できるようにすることのバランスが取れている場合があります。
Cのコーダーが適切なライブラリを使用しない限り、Matlabは行列を反転するのと同じくらい簡単です。素朴なC実装。十分に安定していません。 Cのコーダーを雇うのは費用がかかるでしょう。 Matlabコードをscipyに移植して速度を比較するか、Matlabのcコンパイラを使用するか、またはハードウェアを投入するだけで済むので、はるかに安価でシンプル、安全、高速にできます。