У меня есть код, который я использую для вычисления итераций, необходимых для сходимости последовательности Коллатца числа к единице:
nums = input('Enter a number: ');
iter = zeros(1, nums, 'uint16');
collatz = zeros(1, nums, 'uint64');
seqn = zeros(nums, 'uint64');
parfor ii = 1:nums
num = ii;
collatz(ii) = num;
% seqn(ii) = num;
while num ~= 1
% writes the maximum number reached
if collatz(ii) < num
collatz(ii) = num;
end
if rem(num, 2) == 0
num = num / 2;
else
num = 3 * num + 1;
end
% counts iterations needed to reduce each number to one
iter(ii) = iter(ii) + 1;
% records the sequence
seqn(:, iter(ii)) = num;
end
end
Короче говоря, он вычисляет последовательность Коллатца для каждого числа до num
, записывает максимальное число в последовательности и записывает количество итераций, которые потребовались, чтобы уменьшить число до единицы.
С матрицей seqn
я пытаюсь записать последовательность Коллатца для каждого числа, для которого я запускаю цикл.
Проблема здесь в том, что MATLAB не запустит этот цикл PARFOR
из-за изменений, внесенных в seqn
. Я не понимаю причину! Мне кажется, что то, что я делаю с iter
, по сути то же самое, что я делаю с seqn
, в том смысле, что оно выполняется внутри вложенного цикла WHILE
и не зависит от предыдущих итераций.
Что я могу сделать, чтобы исправить это?
parfor
можно найти в этот мой ответ< /а>. (Сейчас я удалю другие комментарии, так как я думаю, что половина из них либо неверна, либо покрыта ответом здесь, и немного подчистит) - person Adriaan   schedule 03.04.2017