在Matlab中并行for循环

时间:2016-09-19 15:35:46

标签: matlab parfor

我在我的代码中使用parfor,我阅读了所有parfor限制,我认为我做的一切都是正确的:

for it = 1:maxiter
    rep_it = it;
    parfor Fo = allFo
        rep_Fo = Fo;
        Fmax = 2*Fo;
        find_rep = find(rep_Fo==allFo) ;
        [Fac, c, F_est,loss] = AutoTen(info.Data,Fmax,2);
        [Fac, F_est_baseline3] = AutoTenBaseline(info.Data,Fmax,1);
        [Fac, F_est_baseline3] = AutoTenBaseline(info.Data,Fmax,2);
        est_rank(find_rep,rep_it) = F_est;
        est_rank_baseline1(find_rep,rep_it) = F_est_baseline3;
        est_rank_baseline2(find_rep,rep_it) = F_est_baseline3;
    end
end

但我收到错误:

  

错误:parfor中的变量est_rank无法分类

任何帮助都很感激如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

您的问题来自用于编制索引的find_reprep_it变量。如果您希望est_rank可以切片,则必须使用Fo索引,如:

est_rank(Fo, rep_it) = F_est;

否则您(即MATLAB)无法保证您不会尝试从两个并行进程访问变量中的相同单元格。

如果我的意图正确,那么此修复应该这样做:

for it = 1:maxiter
    parfor Fo = 1:numel(allFo)
        Fmax = 2*allFo(Fo);
        [Fac, c, F_est,loss] = AutoTen(info.Data,Fmax,2);
        [Fac, F_est_baseline3] = AutoTenBaseline(info.Data,Fmax,1);
        [Fac, F_est_baseline3] = AutoTenBaseline(info.Data,Fmax,2);
        est_rank(Fo,it) = F_est;
        est_rank_baseline1(Fo,it) = F_est_baseline3;
        est_rank_baseline2(Fo,it) = F_est_baseline3;
    end
end

让我知道它是否成功;)