Сегментации Матлаб при переборе вектора
Я векторизу некоторый код matlab, который я ранее написал, и во время этого процесса matlab начал сбой из-за ошибок сегментации. Я сузил проблему до одного типа вычислений: присвоение нескольким свойствам структуры.
например, даже самостоятельное присвоение этой формы в конечном итоге вызывает ошибку seg при выполнении несколько тысяч раз:
[my_class_instance.my_struct_vector.my_property] = my_class_instance.my_struct_vector.my_property;
Я изначально предполагал, что это должна быть утечка памяти, поэтому попытался распечатать свободную память java после каждой итерации, но это оставалось довольно постоянным.
Так что да, полностью в недоумении, почему это ломается: -/
UPDATE: следующие изменения исправляют ошибку seg:
temp = [my_class_instance.my_struct_vector];
[temp.my_property] = temp.my_property;
[my_class_instance.my_struct_vector] = temp;
теперь вопрос в том, почему это что-то исправит. Возможно, что-то о повторном доступе к классу дескрипторов, а не к списку структур?
ОБНОВЛЕНИЕ 2: СЮЖЕТ СГУЩАЕТСЯ
Я, наконец, воспроизвел проблему и работу с помощью фиктивной программы, достаточно простой, чтобы опубликовать здесь:
a простой класс:
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, а затем упомянул тот же обходной путь, который я обнаружил: используйте временный переменная.
да...
довольно уверен, что этот вопрос заканчивается этим билетом поддержки, но если какие-либо смелые люди хотят сделать снимок о том, почему эта ошибка существует вообще, я определенно буду заинтересован в таком ответе. (учиться-это весело!)
1 ответов
на сегодняшний день наиболее вероятной причиной является то, что операция внутренне использует самоизменяющийся код. Проблема в том, что современные процессоры имеют кэш процессора, поэтому, если вы измените код в памяти, но код уже был зафиксирован в кэше, он будет генерировать ошибку seg.
причина, по которой он является случайным, заключается в том, что он зависит от того, находится ли измененный код в кэше во время модификации и других факторов.
чтобы избежать этого программист должен быть убедитесь, что код очистит кэш перед выполнением самомодификации.