我正在尝试使用 parfor 实现一个非常简单的程序,但我遇到了一些错误。我几乎看到了所有可能重复的 SO 问题,但没有一个与我的问题情况相似。我得到的错误是:
错误:变量 log_likelihood_II_with_entropy 在帕尔福不能 机要。
我的代码写在下面:
em_iterations=10;
users=5;
log_likelihood_II_with_entropy=zeros(users,em_iterations);
parfor u = 1:1:users
for current_iter=1:1:em_iterations
log_likelihood_II_with_entropy(u,current_iter)=rand();
end
end
由于log_likelihood_II_with_entropy
依赖于parfor
索引(u
)和"内部索引"(current_iter
),因此无法分类。每个parfor
迭代都独立于其他迭代,并且它们不按顺序执行(也就是说,u
不一定会按顺序从 1 到 users
顺序 1,2,3,4,..., users
)。
我的建议是让单个parfor
迭代(worker)构建一整行log_likelihood_II_with_entropy
。
parfor u=1:users
single_row=zeros(1,em_iterations);
for current_iter=1:1:em_iterations
single_row(current_iter)=rand();
end
log_likelihood_II_with_entropy(u,:)=single_row;
end
通过这种方式,每个parfor
任务(parfor
体本身)都将预分配和评估单个行,无论u
值是多少。然后它将在log_likelihood_II_with_entropy
矩阵中替换/连接该值。
Parfor 循环不喜欢你有 2 个变量,因为它可能会混淆。要么使用单元数组来存储,要么切换 for 和 parfor 循环的顺序,如下所示。
em_iterations=10;
users=5;
log_likelihood_II_with_entropy=zeros(users,em_iterations);
for u = 1:1:users
parfor current_iter=1:1:em_iterations
log_likelihood_II_with_entropy(u,current_iter)=rand();
end
end