2017-04-02 93 views
0

我有,我用它來計算收斂一些的在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://stackoverflow.com/a/37696213/5211833 )可能會幫助你,它看起來像你想要的一樣。一般'parfor'提示可以在[我的答案]中找到(http://stackoverflow.com/questions/32146555/saving-time-and-memory-using-parfor-in-matlab/32146700#32146700)。 (我現在會刪除其他評論,因爲我認爲他們中的一半或者錯誤,或者被這裏的答案覆蓋,並且清理一下) – Adriaan

回答

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 
+0

用'for'循環代替'while'的好主意!我最初拒絕了它,因爲我不知道我需要做多少次迭代,但是所有證據(數字高達10^8)都表明10^6會綽綽有餘。當我有機會訪問我的機器並回來時,我會檢查這個:) – Gallifreyan

+0

... aaa和我的筆記本電腦幾乎崩潰了:D內存使用增加到我的最大值(8 Gb) - 這與我的實現無關。雖然看不到原因。 – Gallifreyan

+0

哦,這可能是預分配 - 「uint32」和「uint64」吃了太多的RAM。 – Gallifreyan