14

MATLAB は値渡し言語です。ピクセルの隣人を処理する再帰関数があります。関数が呼び出されるたびに画像 (私の場合は 2 つの画像) のコピーを作成するのは非常にコストがかかります。

グローバル変数を使用して問題を解決しました。再帰関数で配列を変更する他の方法はありますか?

4

4 に答える 4

10

ここには 3 つのオプションがありますが、Matlab では 'copy-on-write' が使用されているため、それらのいずれも必要ない場合があります。つまり、変数は変更した場合にのみコピーされます。

  1. @gnoviceが言及しているように、ネストされた functionを使用できます。ネストされた関数内で使用される変数は、ネストされた関数と外側の関数の間で共有されます。ネストされた関数は、デバッグがやや難しく、記述/理解が少し複雑です。
  2. 画像は、参照によって渡されるハンドル オブジェクトのプロパティとして保存できます。
  3. Matlab は再帰関数を使用するのに最適な言語ではないため、再帰関数を使用しないように別の方法でコードを記述することができます。画像処理ツールボックスにアクセスできる場合は、 のような関数を使用したり、関数を書き換えblockprocたりできる場合があります。im2col

最後に、現在のスキームを維持したい場合は、グローバルの代わりに永続変数を使用することを強くお勧めします。

于 2010-11-09T20:21:23.990 に答える
6

MATLAB は常に値渡しであるとは限りません。MATLAB の新しいバージョンは、状況によっては参照渡しを行います。インプレース操作と、この SO 投稿のMATLAB メモリ管理に関するより一般的な議論を参照してください。

テールコールの最適化がなければ、再帰を使用するのは非効率的であり、MATLAB には私の知る限りではありませんが、すべての再帰は loop に変換できます

于 2010-11-09T20:21:17.117 に答える
3

再帰関数を、画像データが保存されている別の関数内のネストされた関数にすると、再帰関数は画像データを渡さなくても画像データを変更できます。

于 2010-11-09T20:07:00.780 に答える
2

これはよくある誤解です。MATLABのsytanxは値渡しですが、Cのように実際には値渡しされません。インタープリターは、必要な場合にのみコピーを作成できるほど賢いです。したがって、先に進んで値を渡し、メモリの問題が発生するかどうかを確認する必要があります。

他の投稿者が指摘しているように、とにかくMATLABでの再帰を避けるようにしてください。

于 2010-11-10T14:54:58.840 に答える