2015-01-23 5 views
1
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, чтобы определить, какое сочетание обеспечивает самое высокое перекрытие. Поскольку существует 10 с, если не сотни тысяч комбинаций, я думал, что parfor поможет ускорить анализ, поскольку у меня есть кластер, который может выделить 16 ядер для этой задачи.parfor цикл не будет работать, если заявление в MATLAB

Проблема, которая возникает у меня с переменной highest_overlap. Если я определяю его за пределами цикла parfor, MATLAB даже не позволит мне запустить анализ, потому что он определен вне цикла parfor, однако, если я не определяю его вне цикла parfor, MATLAB падает, когда он попадает в parfor, потому что он не определен.

Может ли кто-нибудь предложить предложение исправить проблему, которую у меня есть? Я думаю, что оператор IF может иметь какое-то отношение к этому, я должен был определить highest_overlap, как он является дифференциальным, потому что, если бы я только что сделал, если highest_overlap==overlap, он сказал мне, что я неправильно использовал переменную highest_overlap. Поэтому я возьму любые решения, чтобы заставить этот код работать, который у вас может быть. Является ли это изменением способа использования максимального перекрытия или всей структуры кода до тех пор, пока оно выполняется.

+0

Привет и добро пожаловать в SO! Я только что отредактировал ваш вопрос, чтобы улучшить форматирование - сделайте это самостоятельно в будущих вопросах. Разумный текст облегчает ответ. :-) –

+0

У меня нет решения для вашей проблемы, но я бы настоятельно рекомендовал не использовать поиск в сетке (с или без 'parfor'), а функцией оптимизации. Посмотрите на 'fminsearch' и друзей. –

+1

Это невозможно, потому что у вас есть зависимость между итерациями. Вторая итерация parfor требует, чтобы первый оценил 'high_overlap'. Где вы меняете «EEG_amp» в своем коде, я действительно не понимаю, как это работает. – Daniel

ответ

1

Отъезд MATLAB's classification of parfor variables. Parfor немой и будет кричать, если не ясно, какой тип переменной каждый из них.

В вашем случае, когда high_overlap не определяется вне цикла, это временная переменная и, таким образом, не сохраняется для каждой итерации цикла, которая не будет работать для вашей проблемы. Учитывая логику MATLAB, она должна быть временной переменной, потому что вы присваиваете ему, то есть

highest_overlap=max(highest_overlap,Overlap)-Overlap; 

означает highest_overlap временная переменная. Когда вы определяете его за пределами цикла parfor, он видит, что временная переменная уже определена и выдает ошибку.

Итак, как вы обходите это? Самое простое решение - использовать срезанные переменные. Вы можете предварительно распределить вектор и сохранить значения Overlap для вектора, а затем выполнить сокращение, чтобы фактически решить для high_overlap (а не как дифференциал) вне цикла parfor. Так как большая часть вычислительного времени, вероятно, потрачена на другие вызовы функций, это все равно даст хорошее ускорение. Я не совсем понимаю, зачем вам нужен этот оператор if, но для использования переменных среза, как я упоминал, вам нужно будет сэкономить все EEG_amp_value и т. Д. Для среза переменных, а также для восстановления решения.

Из-за того, как работает парфюмерия MATLAB, многие решения требуют сделать что-то, что требует большего объема памяти, используя взамен ускорение. То, как я предложил, будет таким. Однако, если вы действительно осторожны, вы можете получить high_overlap, классифицированный как переменная сокращения, и тогда это сработает, но я думаю, потому что это в утверждении if, которого это не может быть.

Смежные вопросы