Цикл parfor не будет работать с оператором IF в MATLAB
parfor EEG_temp=10:100;
EEG_temp_filter=filter(ones(1,EEG_temp),1,EEG_amp_vals(eeg_temp_subset,:),[],2);
EEG_vertices=eeg_temp_subset((max(EEG_temp_filter,[],2)==EEG_temp)>0);
connected_EEG_vertices=EEG_vertices((sum(surface.VertConn(EEG_vertices,EEG_vertices))>=2)>0);
if length(connected_EEG_vertices)<5000 && length(connected_EEG_vertices)>500
for fMRI_index=1:length(fMRI_thresholds);
signal_union=union(connected_EEG_vertices,unique(fMRI_Vertices(fMRI_index,:)));
signal_intersection=intersect(connected_EEG_vertices,unique(fMRI_Vertices(fMRI_index,:)));
Overlap=length(signal_intersection)/length(signal_union)*100;
highest_overlap=max(highest_overlap,Overlap)-Overlap;
if highest_overlap==0;
EEG_amp_value=[EEG_amp_value,EEG_amp];
EEG_temp_value=[EEG_temp_value,EEG_temp];
fMRI_amp_value=[fMRI_amp_value,fMRI_thresholds(fMRI_index)/100];
highest_overlap=max(highest_overlap,Overlap);
end
end
end % end of if
% eeg_temp_subset=EEG_vertices;
end %end of EEG_temp
Этот код пытается максимизировать три переменные, EEG_temp
, EEG_amp
, а также fMRI_amp
определить, какая комбинация дает наибольшее перекрытие. Так как есть десятки, если не сотни тысяч комбинаций, я думал, что parfor поможет ускорить анализ, так как у меня есть кластер, который может выделить 16 ядер для этой задачи.
У меня проблема с highest_overlap
переменная. Если я определю его вне цикла parfor, MATLAB даже не позволит мне запустить анализ, потому что он определен вне цикла parfor, однако, если я не определю его вне цикла parfor, MATLAB вылетает, когда попадает в цикл parfor, потому что он не определен.
Кто-нибудь может предложить предложение, чтобы исправить проблему, которая у меня есть? Я думаю, что заявление IF может иметь какое-то отношение к этому, я должен был определить highest_overlap
так оно и есть, где это дифференциал, потому что если я только что сделал, если highest_overlap==overlap
, он сказал мне, что я неправильно использовал highest_overlap
переменная. Поэтому я приму любые решения, чтобы этот код работал так, как у вас. Является ли это изменением способа использования максимального перекрытия или всей структуры кода, пока он выполняется.
1 ответ
Ознакомьтесь с MATLAB-классификацией переменных parfor. Парфор глуп и будет кричать, если неясно, к какому типу относится каждая переменная.
В вашем случае, когда наименьшее значение overover не определено вне цикла, это временная переменная, которая не сохраняется для каждой итерации цикла, которая не будет работать для вашей проблемы. Учитывая логику MATLAB, это должна быть временная переменная, потому что вы присваиваете ей, то есть
highest_overlap=max(highest_overlap,Overlap)-Overlap;
означает, что самая высокая переменная - временная переменная. Когда вы определяете его вне цикла parfor, он видит, что временная переменная уже определена, и выдаст ошибку.
Так как же это обойти? Самое простое решение - использовать нарезанные переменные. Вы можете предварительно выделить вектор и сохранить значения перекрытия в векторе, а затем выполнить сокращение, чтобы фактически решить для наименьшего перекрытия (не как разности) вне цикла parfor. Поскольку большая часть вычислительного времени, вероятно, тратится на другие вызовы функций, это все равно должно дать хорошее ускорение. Я не совсем понимаю, зачем вам нужен оператор if, но для использования переменных слайса, как я уже упоминал, вам нужно будет сохранить все EEG_amp_value и т. Д., Чтобы также разрезать переменные для восстановления решения.
Из-за того, как работает parfor MATLAB, многие решения требуют выполнения чего-то, что требует больше памяти в обмен на ускорение. То, как я предложил, будет таким. Тем не менее, если вы действительно осторожны, вы можете классифицировать самое высокое_ перекрытие как редукционную переменную, и тогда оно будет работать, но я думаю, потому что это в операторе if не может быть.