【发布时间】:2015-01-23 15:31:40
【问题描述】:
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 个核心用于任务的集群。
我遇到的问题是highest_overlap 变量。如果我在 parfor 循环之外定义它,MATLAB 甚至不会让我开始运行分析,因为它是在 parfor 循环之外定义的,但是,如果我没有在 parfor 循环之外定义它,MATLAB 在到达parfor 循环,因为它没有被定义。
谁能提供解决我遇到的问题的建议?我认为 IF 语句可能与它有关,我必须将 highest_overlap 定义为差异的方式,因为如果我只是这样做 if highest_overlap==overlap,它告诉我我在滥用 highest_overlap多变的。因此,我将采取任何解决方案来使您可能拥有的此代码正常工作。无论是对最高重叠的使用方式的更改,还是对整个代码结构的更改,只要它运行即可。
【问题讨论】:
-
您好,欢迎来到 SO!我刚刚编辑了你的问题以改进格式——请在以后的问题中自己做。清晰的文字使回答更容易。 :-)
-
我没有解决您的问题的方法,但我强烈建议不要使用网格搜索(有或没有
parfor),而是使用优化功能。看看fminsearch和朋友们。 -
这是不可能的,因为迭代之间存在依赖关系。 parfor 的第二次迭代需要第一次的结果来评估
highest_overlap。你在哪里更改代码中的EEG_amp,我真的不明白它是如何工作的。 -
EEG_amp 是它自己的 for 循环,我上面的所有内容都嵌套在其中。但是,如果 MATLAB 允许我在 parfor 循环中定义最高重叠,则不会有依赖关系,因为对于所有迭代,都会定义一个值,并且此时已经运行了多少次迭代并不重要,这么久因为当前的大于前一个。
-
@ a Donda 我不能使用 fminsearch,因为 fminsearch 不允许使用整数。结果,它坐在那里对 .01 或 .001 的顺序上的时间阈值进行更改,这对于该数据集没有意义,因此优化最终成为无论初始条件是 +- 一些非常非常小的变化。