3

大きな配列 (それぞれ約 70 MB) を使用しており、それらを関数に渡すことが心配です。私の理解では、Matlab は値渡しの関数引数を使用し、呼び出された関数のローカル コピーを作成します。

汚い回避策として、大きな配列をグローバルとして宣言し、計算が完了したら手動で割り当てを解除しました。

私の質問: Matlab でポインターを使用する方法はありますか? これは、C/C++ で行う方法です。そうでない場合、他のよりメモリ効率の良い方法はありますか? グローバルは一般的に悪い考えだと読んだことがあります。

4

2 に答える 2

1

また、グローバルも一般的に悪い考えであることをどこでも読んだことがあります。そして、特に、私は同意しません。各ツールには独自の目的があります。

私はコードの最適化に取り組んでおり、提示されたすべての「より良いオプション」の中で、アプリケーションでグローバルを使用すると、コードの実行が完全に 20% 高速化されることがわかりました。

コードは GPS 信号を処理するためのものです... GPS 信号の特定の特性を定義するすべての関数で共通に使用される多くのパラメーターがあります。また、多数のネストされた関数とそれらの関数への反復呼び出しがあります。

1 つのパラメーターを関数に渡す方が、その関数がグローバル変数にアクセスするよりも多少速い場合があります。私の場合、各関数が必要な 3 つまたは 4 つのグローバル変数にアクセスする方が、ネストされた関数のチェーン全体に 10 個のパラメーターすべてを渡すよりもはるかに高速です。

グローバル変数を使用した 8.5 秒のチックタックは、パラメーターの受け渡しまたはネストされた関数を使用した 10.5 秒よりも高速です。それで、悪い考えですか?パフォーマンスを受けます、ありがとう。

私のポイント?グローバルの方がうまく機能する場合は、グローバルを使用してください。どちらの方法でも試してみてください...しかし、関数で大きな配列を変更すると、その配列は参照されるだけでなく、ローカルにコピーされます。グローバルをルックアップしてから、70MB のコピーを作成します。

低レベル言語では、グローバル変数をできる限り避けることに同意します...しかし、それらの言語はポインターと定数を提供します。MATLAB は、プログラミング方法と最適化方法を実際に知っている人のために作られたものではありません。インタープリターが最適化しない場合; どうやらあなたはSOLのようです。

于 2015-03-28T00:02:11.273 に答える
1

@mutzmatron がコメントで私の質問に答えたので、これを再投稿します。

実際、Matlab は、値で渡す必要があると判断しない限り、参照で渡します...こちらの説明を参照してください: http://www.mathworks.com/matlabcentral/answers/...

于 2013-03-22T18:03:08.340 に答える