-->

PARFOR循环不会与MATLAB IF语句工作(parfor loop won't wor

2019-10-21 16:04发布

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以确定哪个组合产生最高的重叠。 由于是,如果组合中没有几十万我想PARFOR将有助于加快分析,因为我有一个可以投入16个内核的任务集群10秒。

我遇到的问题是与highest_overlap变量。 如果我把它定义了PARFOR循环之外,MATLAB甚至不会让我开始运行的分析,因为它是在PARFOR循环外部定义,但是,如果我没有当它到达的PARFOR循环MATLAB崩溃之外定义它PARFOR循环,因为它没有定义。

任何人都可以给您一个建议来解决我的问题吗? 我认为IF语句可能有一些用它做,我不得不定义highest_overlap事情是这样的地方是一个差,因为如果我只是做了,如果highest_overlap==overlap ,它告诉我,我被滥用highest_overlap变量。 因此,我将采取任何解决方案,以获得此代码工作,你可能有。 它是否是一个变化到使用最高重叠的方式或整个代码结构,只要它运行。

Answer 1:

退房PARFOR变量的MATLAB的分类 。 PARFOR是愚蠢的,如果它不明确每个人是什么类型的变量会尖叫。

在你的情况下,当highest_overlap不循环的外部定义,它是一个临时变量,因此不保存循环,不会对你的问题的工作的每一个迭代。 鉴于MATLAB的逻辑,它必须是一个临时变量,因为分配给它,那就是

highest_overlap=max(highest_overlap,Overlap)-Overlap;

装置highest_overlap是一个临时变量。 当你再定义它的PARFOR循环之外,它看到的临时变量已经被定义,并会引发错误。

那么,你如何得到解决呢? 最简单的解决方法是使用切片变量。 可以预先分配的矢量和重叠的值保存到该载体,然后执行实际为highest_overlap(不作为差分)的PARFOR循环之外解决的降低。 由于大部分的计算时间可能是在其他函数调用中度过,这仍然应该提供一个良好的加速。 我完全不明白为什么你需要的,如果声明那里,但正如我所说,你需要保存了所有的EEG_amp_value等切片变量以及恢复解决方案中使用切片变量。

由于MATLAB的方式PARFOR作品,许多解决方案需要做一些需要更多的内存使用,以换取加速。 我建议的方式将是这样。 但是,如果你真的很小心,你可能能够得到highest_overlap列为减少变量,然后它的工作,但我想是因为它在if语句就不能。



文章来源: parfor loop won't work with IF statement in MATLAB
标签: matlab parfor