2016-08-16 4 views
1

これは奇妙な質問ですが、うまくいけば誰かが私を助けることができます。 私は構造体配列で動作する必要があるコードの並列化された性質のために、私はmatlabのコードを持っています。アレイをコピーしますがメモリを増やさない

parforループを実行した後、それらの構造体配列を3次元配列に変換したいと思います。

私は次のコードを使用しています現時点では:

for k = 1:nsim 
    ksim(:,:,k) = st(k).ksim; 
    Msim(:,k) = st(k).Msim; 
    Vsim(:,:,k) = st(k).Vsim; 
    Psim(:,:,k) = st(k).Psim; 
end 
clearvars st 

をしかし、これは一時的にMATLABは、メモリ使用量を倍増almosので、すべての行列を倍にする必要があるので、非常に非効率的であると思われます。 多くのメモリ使用量を増やすことなくこれを達成するよりスマートな方法はありますか?

+0

なぜ構造体としてデータを残すことはできませんか? – Adriaan

+0

なぜ構造物を使用する必要がありますか?あなたはあなたの出力をあらかじめ割り当てておき、それを並列部分に入れておくことができます。おそらく、あなたはその部分についての詳細を共有することができます。 – Matt

+0

構造体を使用しない場合、行列は3次元A(i、j、k)です。ここで、kはパラレル化された次元です。 Parforはこれらでは動作しません。一方、struct(k).A(i、j)を作ると完全に動作します。 – phdstudent

答えて

0

私はこれをあなたが探している答えとはみなしません。しかしそれは改善です。

新しい配列を定義し、フィールドを1つずつ削除します。 3つの巨大な出力があるように見えるので、メモリ使用量のピークが200%ではなく130%に減少します。

for k = 1:nsim 
    ksim(:,:,k) = st(k).ksim; 
end 
st = rmfield(st , 'ksim'); 
for k = 1:nsim 
    Msim(:,k) = st(k).Msim; 
end 
st = rmfield(st , 'Msim'); 

などとなる。

関連する問題