Распараллеливание с parfor в MATLAB
Я пытаюсь распараллелить цикл в MATLAB и получаю сообщение об ошибке: "Действительные индексы для X_train ограничены в циклах PARFOR". Мой код ниже:
parfor c = 1:num_channels
% sum_n_train calculated here
for n = 1:sum_n_train
bin_n = bin(n);
Xmj = X_train(bin_n, :);
% some calculations happen in between
X_train(bin_n,:) = Xmj;
X_train(bin_n, p) = X_train(bin_n, p) + 1;
z_train(n)= zind;
end
z_train_cell{c} = z_train;
end
X_train - это матрица n by p, а Xmj - вектор 1 by p. Ошибка для X_train. Из прочтения документации я вижу, что индексирование для каждой переменной должно быть исправлено в цикле parfor. Даже когда я закомментирую строку X_train(bin_n, p) = X_train(bin_n, p) + 1;
(индекс X_train которого отличается от двух других строк), однако я все еще получаю сообщение об ошибке. Может кто-нибудь объяснить, почему и как я могу обойти это?
2 ответа
Анализ
Я не могу попробовать это сам, но кажется, что вы пытаетесь написать одно и то же в нескольких случаях parfor
петля.
Это похоже на
X_train(bin_n,:)=Xmx
Будет происходить каждый раз, когда вводится parfor, а именно: X_train(1,:)
часто перезаписывается, как упоминал @Daniel.
Решение
Вот что вы можете сделать:
- Закомментируйте строки одну за другой, начните с самой простой и продолжайте, пока ошибка не исчезнет
- Добавьте измерение ко всем переменным, которые назначены в закомментированных строках. Это должно сделать назначения для них не перекрывающимися.
Пример:
`X_train(c,bin_n,:)`
Затем снова раскомментируйте и запустите код! Если проблема все еще возникает, вам может понадобиться добавить измерение к большему количеству переменных.
Я дал ответ на подобную проблему здесь. MATLAB не знает, что делать с
X_train(bin_n,:)
X_train(bin_n, p) = X_train(bin_n, p) + 1;
поскольку он должен разделить X_train на нужные процессоры перед циклом, но он не знает, как разделить, пока вы не вычислите индексы bin_n. Проще говоря, вы не можете сохранить в переменных индексов.
Если ячейки не перекрываются, вам необходимо жестко закодировать эти индексы с постоянными значениями. Если бункеры перекрываются, то они зацикливаются, как будто решения зависят от порядка их выполнения (т. Е. Вы обновляете X_train в местах bin_n, но используете его через Xmj для вычисления других вещей в оставшейся части), что означает проблему в его текущая форма не может быть решена с помощью parfor.