2016-10-16 18 views
0

私は意味識別子(例えば、inputs = [...])を持つ多くのベクトルを持っています。私は、それらの多くを繰り返し処理できるように、それらをセル配列に入れたいと思います。MATLAB cellarrayには参照がありませんか?

inputs(1).myfield = 2 % some arbitrary value 
mycellarray{1} = inputs 
inputs(1).myfield = 3 % some arbitrary value 
assert(mycellarray{1}(1).myfield == inputs(1).myfield) 
% => FAIL 

セル・アレイは、{1}1x5 MyObject arrayを保持していると言うが、どうやらそれはinputsと同じオブジェクトを参照しません。しかし、私はしようとします。

私はどのようにして目標を達成できますか? (ベクトルが同じ長さではないので、ベクトルを行列に入れることはできません。)

+3

Matlabには参照がありません。コピーされたものは –

答えて

0

値渡しのMatlabオブジェクトに記載されているコメントと同じです。しかし、次のトリックはGNUオクターブ(Matlabの中で、私はよく分からない)で行うことができます

ref = @(name) @(index) evalin('caller',sprintf('%s(%d)',name,index)); 

inputs(1).myfield = 2; 
mycellarray{1} = ref('inputs'); 
inputs(1).myfield = 3; 
assert(mycellarray{1}(1).myfield == inputs(1).myfield) 

refnameを取得し、indexを取得する関数ハンドルを返す関数であると表現name(index)

を評価します

したがって、mycellarray{1} = ref('inputs');と書くと、関数ハンドルがセル配列に格納されます。

次に、mycellarray{1}と書くと、関数ハンドル@(index) evalin('caller',sprintf('%s(%d)',name,index))が返されます。

mycellarray{1}(1)と書くと、式inputs(1)が評価され、その結果が返されます。我々はmyfieldが返さmycellarray{1}(1).myfieldフィールドを書くとき

注意(Matlabのでは動作しません):上記の方法でmyfieldの値のみを取得することができますが、割り当てることはできません。

+1

です。MATLABがコールバイバリューであることに加えて、もう一つ注目すべき点があります。 MATLABでは、変数としてメモリの場所を格納する方法もありません。変数の値は、常にこの変数に格納されている値です。 – patrik

関連する問題