我在MATLAB中有一个代码,我使用 parfor 而不是简单的 for 循环运行monte-carlo模拟,将代码从顺序转换为并行。以下是 parfor 循环中的代码段。
但是MATLAB给出了一个错误,“local_Q_mega_sub_seed的有效索引在 parfor 循环中受到限制”。建议的操作说“修复索引”,它建议使用“切片变量”。我一直在努力使用这个概念。我已阅读https://blogs.mathworks.com/loren/2009/10/02/using-parfor-loops-getting-up-and-running/#12和https://www.mathworks.com/matlabcentral/answers/123922-sliced-variables-in-parfor-loop-restricted-indexing以及MATLAB文档https://www.mathworks.com/help/distcomp/sliced-variable.html和https://www.mathworks.com/help/distcomp/parfor.html,但我说得不对。
有谁能告诉我如何在给定的代码段中使用切片变量以便我能够得到一个想法?
index_f = 1;
subseed_step = (sub_seed_transmitted_at/fs_local)*sintablen_mega_frequency;
for i = 1 : fs_local
local_Q_mega_sub_seed(i) = SINTAB(round(index_f));
local_I_mega_sub_seed(i) = COSTAB(round(index_f));
index_f = index_f + subseed_step;
if index_f>sintablen_mega_frequency
index_f = index_f - sintablen_mega_frequency;
end
答案 0 :(得分:1)
你在这里没有显示足够的背景,但我敢打赌这里的问题类似于这个问题:
parfor ii = 1:10
for jj = 1:10
tmp(jj) = rand
end
out(ii) = sum(tmp);
end
在这种情况下,parfor
机制无法明确证明tmp
的使用方式与parfor
循环的迭代顺序无关。这是因为出现,好像在tmp
循环的一次迭代中分配给parfor
的值仍在下一次迭代中使用。
幸运的是,对于这种情况,有一个非常简单的解决方法 - 说服parfor
通过重置变量,你没有做任何依赖于循环迭代评估顺序的事情。在上面的简单案例中,这意味着:
parfor ii = 1:10
% reset 'tmp' at the start of each parfor loop iteration
tmp = [];
for jj = 1:10
tmp(jj) = rand
end
out(ii) = sum(tmp);
end