如何在嵌套的WHILE循环中附加一个矩阵是MATLAB中的一个PARFOR循环?
我有,我用它来计算收敛一些的在Collatz序列所需的迭代一个代码:如何在嵌套的WHILE循环中附加一个矩阵是MATLAB中的一个PARFOR循环?
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
将在Collatz序列将数字加起来,在最大记录数序列,并记录减少的次数为1的迭代次数。
与seqn
矩阵,我试图记录我运行循环的每个数字的Collatz sequnece。
这里的问题是MATLAB不会运行这个PARFOR
循环,因为对seqn
进行了更改。我不明白原因!在我看来,我对iter
所做的与seqn
基本上是一样的,因为它在嵌套的WHILE
循环内执行,并且不依赖于以前的迭代。
我能做些什么来解决这个问题?
我已将您的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
用'for'循环代替'while'的好主意!我最初拒绝了它,因为我不知道我需要做多少次迭代,但是所有证据(数字高达10^8)都表明10^6会绰绰有余。当我有机会访问我的机器并回来时,我会检查这个:) – Gallifreyan
... aaa和我的笔记本电脑几乎崩溃了:D内存使用增加到我的最大值(8 Gb) - 这与我的实现无关。虽然看不到原因。 – Gallifreyan
哦,这可能是预分配 - “uint32”和“uint64”吃了太多的RAM。 – Gallifreyan
[这个答案由MATLAB员工(http://*.com/a/37696213/5211833 )可能会帮助你,它看起来像你想要的一样。一般'parfor'提示可以在[我的答案]中找到(http://*.com/questions/32146555/saving-time-and-memory-using-parfor-in-matlab/32146700#32146700)。 (我现在会删除其他评论,因为我认为他们中的一半或者错误,或者被这里的答案覆盖,并且清理一下) – Adriaan