2012-08-28 44 views
15

我一直在向量化我以前編寫的一些matlab代碼,在這個過程中,由於分割錯誤,matlab開始崩潰。我將問題簡化爲單一類型的計算:分配給多個結構屬性。迭代向量賦值時的Matlab分割錯誤

例如,這種形式的甚至自賦值執行幾千倍時最終導致一個賽格故障:

[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;

我最初認爲這肯定是某種內存泄漏,所以嘗試在每次迭代後打印出java的可用內存,但這仍然相當穩定。

所以是的,完全不知所措現在,爲什麼這打破: -/

UPDATE:以下更改固定SEG斷層:

溫度= [my_class_instance.my_struct_vector];

[temp.my_property] = temp.my_property;

[my_class_instance.my_struct_vector] = temp;

現在的問題是爲什麼這會解決任何問題。可能會重複訪問句柄類而不是結構列表?

更新2:情節複雜

我終於複製的問題和解決辦法使用虛擬程序很簡單,張貼在這裏:

一個簡單的類:

classdef test_class 
    properties 
     test_prop 
    end 
end 

而且一個程序會在類中做一堆矢量賦值,並且會一直崩潰。

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 

更新3:劇情變薄

原來我發現了一個錯誤。根據Matlab技術支持,在R2011a中(並且可能在早期版本中),類屬性的重複向量賦值不起作用。他告訴我,它在R2012a中工作正常,然後提到我發現的相同解決方法:使用臨時變量。

所以呀...

敢肯定這個問題與支持票結束,但如果任何敢於冒險的想拿一個鏡頭,爲什麼這個bug都存在,我肯定還是對這樣的答案感興趣。 (學習很有趣!)

+0

什麼是您的Matlab版本? –

+0

R2011a爲贏7 64位 – zergylord

+0

不能幫你在這裏...我有R2010b在Linux 64位,它在那裏工作得很好。你有內存轉儲或類似的嗎? –

回答

3

到目前爲止,最可能的原因是該操作在內部使用自修改代碼。問題在於現代處理器具有CPU高速緩存,所以如果您在內存中更改代碼,但代碼已被提交到高速緩存,則會生成seg故障。

它是隨機的原因是因爲它取決於修改代碼是否在修改時在緩存中以及其他因素。

爲了避免這種情況,程序員必須確保在執行自我修改之前讓代碼刷新緩存。

+0

你已經成功從編程食屍鬼的神殿中移除了一個幽靈。謝謝,祝賀! – zergylord