2016-09-02 23 views
0

繰り返しアルゴリズムで何回も異なる関数に何回も渡す必要があるいくつかの大きな行列があります。プログラムを高速化するために関数への変数の不要なコピーを避けるにはどうすればよいですか?これらの行列を構造体やクラスにグループ化し、参照やポインタで渡す方法はありますか?Matlabで構造体またはクラスオブジェクトを関数に参照渡しする方法

a=zeros(1000,1000); 
b=zeros(1000,1000); 
d=myfunction(a,b); 
a=myfunction2(b,d); 
.... 

ありがとうございます。

更新:コメントに表示されているように、詳細を提供する必要があります。私はいくつかの大きな行列を持っています。それらのプログラムのうちのいくつかはプログラム内で一定のままであり、他のものは反復ごとに各機能において変化する。したがって、これらの行列を値で渡すと、Matlabはそのコピーを作成し、値を変更して関数の出力としてコピーし、スコープから外して破棄し、これらの不要なコピーをすべて繰り返しますひどく遅い。もし私がC++でプログラムしたいのであれば、これらの行列に対してオブジェクト指向プログラミングを使用し、それらを関数への参照として渡しますが、MATLABで可能かどうかはわかりません。

+2

'myfunction'が' a'と 'b'を変更しない場合は、変数のコピーがなくなり、参照として渡されます。 MATLABはかなりスマートであり、これらのことはすべてフードの下で行います –

+0

http://stackoverflow.com/questions/38113315/matlab-variable-passing-and-lazy-assignment/ –

+0

@AnderBiguriこれらは参考として渡されません。コピーオンライト(copy-on-write)の振る舞いで値を渡す。 http://stackoverflow.com/questions/38113315/matlab-variable-passing-and-lazy-assignment/への私の答えを参照してください。 –

答えて

1

Anderさんのコメントは本当です。つまり、変数の内容を変更する関数が必要な場合は、このシナリオを避けるためにコードをリファクタリングすることが考えられます。あなたが投稿したコードはちょうど単純な例ですが、それを見て、 "abを関数の外で初期化する必要がありますか?関数がそれらを初期化して代わりに返しますか?"

実際にが回り込むことができない場合は、データをhandle classにカプセル化して、代わりに関数にハンドルクラスを渡すことができます。

+0

事実、OPが実際にそれを回避できない場合は、それがCであってもコピーが必要なことを意味します。一般的に、何も幻想的なものは必要ありません –

+0

それは必然的にコピーが作られなければならないということを必ずしも意味しません。この例では、2つの行列を0に初期化しているので、関数はおそらく関数を実行していると考えられます。この例からは、少なくとも彼が上書きを避けなければならない既存のデータはないとは思われません。ここでの最終目標は、途中で何度もコピーされることなくソリューションを生成することです。しかし、私は知らない。その場合、コンテナとしてのハンドルクラスがそのトリックを行います。 – CKT

+0

@CKT答えに感謝します。いくつかの行列はプログラム全体にわたって一定のままであり、他の行列はすべての関数で変更され、新たに得られた行列は次の関数などで使用されます。プログラムがかなり大きいので、他の方法はありません。デバッグが難しく、またプログラミングスタイルが悪いグローバル変数を使うこともできますし、これらの行列をいくつかの構造やクラスに入れて参照として渡すこともできます。 – Eman

関連する問題