我有一个代码,用于计算将数字的Collatz序列聚合为一个所需的迭代:
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
很快,它会为每个数字计算Collatz序列,最多为num
,记录序列中的最大数量,并记录将数量减少为1的迭代次数。
使用seqn
矩阵,我正在尝试记录我运行循环的每个数字的Collatz sequnece。
问题在于,由于对PARFOR
所做的更改,MATLAB不会运行此seqn
循环。我不明白原因!在我看来,我对iter
的所作所为与seqn
基本相同,因为它在嵌套的WHILE
循环内执行并且不依赖于先前的迭代。
我该怎么做才能解决这个问题?
答案 0 :(得分:1)
我已将while循环更改为for循环并将iter
的最终值设置为外部。另外,我只设置seqn
的一个元素,而不是像你一样设置整个列。现在matlab让你运行它,但我不确定它是你想要的,所以看看:
nums = input('Enter a number: ');
iter = zeros(1, nums, 'uint16');
maxitr = 1e6;
collatz = zeros(1, nums, 'uint64');
seqn = zeros(nums, 'uint64');
parfor ii = 1:nums
num = ii;
collatz(ii) = num;
% seqn(ii) = num;
for itr = 1:maxitr
if num == 1
break
end
% 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
% records the sequence
seqn(ii, itr) = num;
end
iter(ii) = itr - 1;
end