2016-10-12 5 views
1

、私たちは、私が望んで配列フィールドの構造体を直接作成できますか? MATLABで

struct('a',1:4) 

それは構造体の配列を作成しますが...

s = struct('a',[]); 
s.a = 1:4; 

我々は、単一のコマンドで行うことができますされませんか?

+1

'struct( 'a'、1:4)'では、1つのフィールド 'a:[1 2 3 4]'を持つ構造体を取得します。 (R2015b) – erfan

答えて

2

あなたは

s.a = 1:4; 

を行う場合は、MATLABは、自動的に最初の行のための必要性を構造体を作成しません。

t1 = 1.3965e-06 
t2 = 7.1217e-06 
t3 = 7.1223e-06 

直接配分することであることを示している

t1 = timeit(@no_preallocation); 
t2 = timeit(@no_preallocation2); 
t3 = timeit(@preallocation); 

function no_preallocation() 
    s.a = 1:4; 
end 

function no_preallocation2() 
    s=struct('a',1:4); 
end 

function preallocation() 
    s = struct('a',[]); 
    s.a = 1:4; 
end 

を私が手:

は(質問の下のコメントを参照) timeitを使用する2つのバージョンともERFANのバージョン間の の性能差を取得するには実質的に速い。

しかし、はあなたが前にメモリにsを持っていた場合つまり、フィールドaを割り当てる前に、あなたが実際に構造体sを削除していないので、特にスクリプトでは、奇妙な行動につながることができます事前に割り当てるしないことに注意してくださいそれを保持し、意図した動作ではない可能性のあるaを上書きするだけです。したがって、エドリックとエルファンによって提案されたような事前配分が最も良いようです。

+0

@ihcgeneva一般に、私の構造体には2つの配列型のフィールドがあります。だから私たちはs.a = 1:4; s.b = 5:8;私はこれで大丈夫です。このダイナミックフィールドの追加でパフォーマンスに問題はありますか? –

+0

これは公正なテストではありません。最初のケースでは、初めてループの周りに配列を構築するだけです。 – Edric

+1

...最初のテストは本当に 's = [];でなければなりません。 s.a = 1:4である。しかし、それは私のマシンで 'struct'を使うよりも4倍速いです。 – Edric

関連する問題