переменная в парфоре не может быть классифицирована. ошибка в Matlab

Я пытаюсь реализовать очень простую программу с помощью 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

person CoderInNetwork    schedule 09.02.2016    source источник


Ответы (2)


Поскольку log_likelihood_II_with_entropy опирается как на индекс parfor (u), так и на «внутренний индекс» (current_iter), его нельзя классифицировать. Каждая итерация parfor независима от других, и они выполняются не по порядку (то есть u не обязательно будет идти от 1 до users в порядке 1,2,3,4,...,users).

Мое предложение состоит в том, чтобы позволить одной итерации parfor (рабочей) построить целую строку 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.

person AlessioX    schedule 09.02.2016
comment
Или даже rand(1,em_iterations) :) - person Andras Deak; 09.02.2016
comment
@AndrasDeak о нет :) Ранд был просто примером: D - person CoderInNetwork; 09.02.2016
comment
@CoderInNetwork Я настоятельно рекомендую вам сохранить C в MCVE (минимальный воспроизводимый пример), это сделает жизнь обоих ответчиков и вам проще. - person Andras Deak; 09.02.2016
comment
@AndrasDeak да, конечно, спасибо - person CoderInNetwork; 09.02.2016
comment
Поскольку log_likelihood_II_with_entropy зависит как от индекса parfor (u), так и от внутреннего индекса (current_iter), его нельзя классифицировать. , Не могли бы вы дать мне реф. за этот факт? - person CoderInNetwork; 09.02.2016
comment
@CoderInNetwork, конечно. Существует целая страница документации Mathworks по классификации переменных в parfor it.mathworks.com/help/distcomp/ - person AlessioX; 09.02.2016

Циклы 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
person ABC    schedule 09.02.2016
comment
Однако разрешены полные срезы массива формы arr(parindex,:,:). Смотрите ответ Алессиокса. Это, если применимо, всегда (почти?) самое быстрое решение. - person Andras Deak; 09.02.2016
comment
Мне не нравится это решение, потому что оно увеличивает накладные расходы на связь. Вместо users многих рабочих мест теперь у вас users*em_iterations много рабочих мест, что увеличивает затраты на связь. - person Daniel; 10.02.2016