如何在嵌套的WHILE循环中附加一个矩阵是MATLAB中的一个PARFOR循环?

问题描述:

我有,我用它来计算收敛一些的在Collat​​z序列所需的迭代一个代码:如何在嵌套的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将在Collat​​z序列将数字加起来,在最大记录数序列,并记录减少的次数为1的迭代次数。

seqn矩阵,我试图记录我运行循环的每个数字的Collat​​z sequnece。

这里的问题是MATLAB不会运行这个PARFOR循环,因为对seqn进行了更改。我不明白原因!在我看来,我对iter所做的与seqn基本上是一样的,因为它在嵌套的WHILE循环内执行,并且不依赖于以前的迭代。

我能做些什么来解决这个问题?

+1

[这个答案由MATLAB员工(http://*.com/a/37696213/5211833 )可能会帮助你,它看起来像你想要的一样。一般'parfor'提示可以在[我的答案]中找到(http://*.com/questions/32146555/saving-time-and-memory-using-parfor-in-matlab/32146700#32146700)。 (我现在会删除其他评论,因为我认为他们中的一半或者错误,或者被这里的答案覆盖,并且清理一下) – Adriaan

我已将您的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 
+0

用'for'循环代替'while'的好主意!我最初拒绝了它,因为我不知道我需要做多少次迭代,但是所有证据(数字高达10^8)都表明10^6会绰绰有余。当我有机会访问我的机器并回来时,我会检查这个:) – Gallifreyan

+0

... aaa和我的笔记本电脑几乎崩溃了:D内存使用增加到我的最大值(8 Gb) - 这与我的实现无关。虽然看不到原因。 – Gallifreyan

+0

哦,这可能是预分配 - “uint32”和“uint64”吃了太多的RAM。 – Gallifreyan