【问题标题】:parfor loop won't work with IF statement in MATLABparfor 循环不适用于 MATLAB 中的 IF 语句
【发布时间】: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_tempEEG_ampfMRI_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 的顺序上的时间阈值进行更改,这对于该数据集没有意义,因此优化最终成为无论初始条件是 +- 一些非常非常小的变化。

标签: matlab parfor


【解决方案1】:

查看MATLAB's classification of parfor variables。 Parfor 很笨,如果不清楚每个变量是什么类型的变量,就会尖叫。

在您的情况下,当最高重叠未在循环之外定义时,它是一个临时变量,因此不会为循环的每次迭代保存,这对您的问题不起作用。给定 MATLAB 的逻辑,它一定是一个临时变量,因为你给它赋值,也就是

highest_overlap=max(highest_overlap,Overlap)-Overlap;

表示highest_overlap 是一个临时变量。然后,当您在 parfor 循环之外定义它时,它会看到临时变量已经定义并会抛出错误。

那么你如何绕过它?最简单的解决方案是使用切片变量。您可以预先分配一个向量并将 Overlap 的值保存到向量中,然后在 parfor 循环之外进行归约以实际求解最高重叠(而不是微分)。由于大部分计算时间可能都花在了其他函数调用上,因此这仍然可以提供很好的加速。我不完全明白为什么你需要在其中使用 if 语句,但要使用我提到的切片变量,你需要保存所有 EEG_amp_value 等来切片变量以及恢复解决方案。

由于 MATLAB parfor 的工作方式,许多解决方案需要执行一些需要使用更多内存的操作,以换取加速。我建议的方式就是这样。但是,如果您真的很小心,您也许可以将highest_overlap 归类为减少变量,然后它会起作用,但我认为因为它在if 语句中它不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多