2012-08-28 9 views
15

私は以前に書いたMATLABコードをベクトル化していましたが、このプロセスでは、セグメント化エラーのためにmatlabがクラッシュし始めました。私は問題を1つの計算タイプに絞りました。複数の構造プロパティに割り当てることです。数千回実行されたときベクトル割当てを反復するときのMATLABセグメンテーションエラー

例えば、この形式のも自己の割り当ては、最終的にワンセグ障害を引き起こす:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_propertyと、

私は最初、これは何らかの種類のメモリリークである必要があると想定していましたので、繰り返しごとにjavaの空きメモリを印刷しようとしましたが、これはかなり一定です。

そうそう、完全に喪失で、今これが壊れる理由として: -/

UPDATE:次のように変更ワンセグ断層が修正されています。

TEMP = [my_class_instance.my_struct_vector]。

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

ここで問題が解決されるのはなぜですか。たぶん構造体リストではなくハンドルクラスに繰り返しアクセスすることについての何か?

UPDATE 2:

単純なクラス:

classdef test_class 
    properties 
     test_prop 
    end 
end 
PLOTは、私が問題とここに投稿するのに十分なシンプルなダミープログラムを使用して周りの仕事を最後に複製されました

を厚く

そして、クラスにベクトル割り当てをして、常にクラッシュするプログラムです。

test_instance = test_class(); 
test_instance.test_prop = struct('test_field',{1 1}); 
for i=1:10000 

    [test_instance.test_prop.test_field] = test_instance.test_prop.test_field; 
end 

UPDATE 3:PLOTは

私はバグを見つけてターンを間引きます。 Matlabのテクニカルサポートによれば、クラスプロパティのベクトル割り当ての繰り返しは、R2011aでは(おそらく以前のバージョンでは)機能しません。彼はそれがR2012aで​​うまく動作すると私に言った、そして私が発見した同じ回避策を述べました:一時変数を使用してください。

そうそう...

この質問は、そのサポートチケットで終わるが、どんな大胆な個人が、このバグが全く存在理由としてショットを取りたい場合は、私は間違いなく、まだだろうかなり確信そのような答えに興味がある。 (学習は楽しいです!)

+0

Matlabのバージョンは何ですか? –

+0

勝利7のためのR2011a 64ビット – zergylord

+0

ここでお手伝いできません...私はLinuxの64ビットでR2010bを持っており、そこでは正常に動作します。メモリダンプなどがありますか? –

答えて

3

これまでのところ、操作は内部的に自己修正コードを使用している可能性があります。これの問題は、最新のプロセッサにはCPUキャッシュがあることです。そのため、メモリ内のコードを変更してもコードはすでにキャッシュにコミットされていると、segフォルトが生成されます。

ランダムな理由は、変更時に変更されたコードがキャッシュにあるかどうかなどによって異なるためです。

これを避けるには、プログラマーは、自己修正を行う前にコードをフラッシュするようにしてください。

+0

ghoulsのプログラミングのパンテオンからもう1つの幽霊を削除しました。ありがとう、おめでとう! – zergylord

関連する問題