while ループ内で 2 つの大きな行列を何度も乗算する必要があるプロジェクトがあります。行列が大きいと、コードの実行が非常に遅くなる可能性があります。
mex と .cpp ファイルを使用すると、この時点でプログラムの速度が本当に向上するかどうかに興味があります。組み込みの MATLAB 行列乗算は、すでにかなり優れているのではないでしょうか?
問題に関するより具体的な情報がなければ、誰もが言える具体的なことはほとんどありません。MEX 関数によって確実にパフォーマンスが向上する場合と、そうでない場合があります。行列の乗算は Matlab の強みの 1 つであり、単に行列の乗算を MEX 関数に移動するだけでは、コードの実行速度が向上する可能性は低くなります。
とはいえ、パフォーマンスを改善するための一般的な戦略がいくつかあります。
コードをプロファイリングします。 行列の乗算が実際に犯人であることを確認してください。私自身の経験では、パフォーマンスの問題は、一時変数の不注意な使用など、さまざまな原因から発生する可能性があります。これは常に最初のステップであるべきです。
マトリックスに何らかの構造がある場合は、それを活用してください。Matlab は、スパース行列とバンド行列をかなり適切にサポートしています。行列に構造がある場合、それを使用すると、行列演算のコストを大幅に削減できます。
MEX 関数を作成する場合は、ループ全体を MEX 関数に移動してwhile
、Matlab/MEX 境界を何度も越えないようにしてください。MEX 関数を繰り返し呼び出すと非常にコストがかかる可能性があり、特にループが単純な反復である場合は、MEX 関数内でループ全体を実行するのと同じくらい簡単 (または簡単) です。
まず第一に、これらのマトリックスは互いに関連しており、時間の経過や同様の状況で進化していると仮定しています。あるインスタンスから次のインスタンスへの各マトリックスが完全に無関係である場合、これは役に立ちません。ただし、それらが関連している場合、マトリックスの変化は小さいか、まばらでさえある可能性があることに気づきました. 基本方程式 C(i) = A(i)*B(i) を考えると、デルタ行列を作成すると Da = A(i+1) - A(i) Db = B(i+1) - B(i)もちろん、C(i+1) = C(i) + Da*B(i) + A(i)*Db + Da*Db ここで、C(i) は既知です。これらの 3 つの行列乗算は、Da と Db が小さいかまばらな場合、はるかに高速になる可能性があります。それらは直交し、最後の項が削除されるか、その結果が 2 番目の大きさとして無視されることさえあります。ちょっとした考え。Matlab 行列問題用のツールはたくさんありますが、まだ Matlab をあきらめないでください。