我在我的代码中使用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无法分类
任何帮助都很感激如何解决这个问题。
答案 0 :(得分:0)
您的问题来自用于编制索引的find_rep
和rep_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
让我知道它是否成功;)