MATLAB は値渡し言語です。ピクセルの隣人を処理する再帰関数があります。関数が呼び出されるたびに画像 (私の場合は 2 つの画像) のコピーを作成するのは非常にコストがかかります。
グローバル変数を使用して問題を解決しました。再帰関数で配列を変更する他の方法はありますか?
MATLAB は値渡し言語です。ピクセルの隣人を処理する再帰関数があります。関数が呼び出されるたびに画像 (私の場合は 2 つの画像) のコピーを作成するのは非常にコストがかかります。
グローバル変数を使用して問題を解決しました。再帰関数で配列を変更する他の方法はありますか?
ここには 3 つのオプションがありますが、Matlab では 'copy-on-write' が使用されているため、それらのいずれも必要ない場合があります。つまり、変数は変更した場合にのみコピーされます。
blockproc
たりできる場合があります。im2col
最後に、現在のスキームを維持したい場合は、グローバルの代わりに永続変数を使用することを強くお勧めします。
MATLAB は常に値渡しであるとは限りません。MATLAB の新しいバージョンは、状況によっては参照渡しを行います。インプレース操作と、この SO 投稿のMATLAB メモリ管理に関するより一般的な議論を参照してください。
テールコールの最適化がなければ、再帰を使用するのは非効率的であり、MATLAB には私の知る限りではありませんが、すべての再帰は loop に変換できます。
再帰関数を、画像データが保存されている別の関数内のネストされた関数にすると、再帰関数は画像データを渡さなくても画像データを変更できます。
これはよくある誤解です。MATLABのsytanxは値渡しですが、Cのように実際には値渡しされません。インタープリターは、必要な場合にのみコピーを作成できるほど賢いです。したがって、先に進んで値を渡し、メモリの問題が発生するかどうかを確認する必要があります。
他の投稿者が指摘しているように、とにかくMATLABでの再帰を避けるようにしてください。