2

我正在尝试使用 parfor 实现一个非常简单的程序,但我遇到了一些错误。我看到了几乎所有可能重复的 SO 问题,但没有一个与我的问题情况相似。我得到的错误是:

错误:parfor 中的变量 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
4

2 回答 2

3

由于log_likelihood_II_with_entropy同时依赖于parfor索引 ( u) 和“内部索引” ( current_iter),因此无法对其进行分类。每次parfor迭代都独立于其他迭代,它们不是按顺序执行的(也就是说,u不一定从 1 到users1,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矩阵中的此类值。

于 2016-02-09T20:08:37.887 回答
1

当您有 2 个变量时,Parfor 循环不喜欢它,因为它可能会混淆。要么使用元胞数组来存储,要么切换 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
于 2016-02-09T20:09:41.587 回答