2017-04-02 6 views
0

私は1に番号のこのCollat​​zシーケンスを収束させるために必要な反復を計算するために使用したコードがあります。MATLABの入れ子になっているWHILEループの中に行列を追加するには?

まもなく
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を記録しようとしています。

ここでの問題点は、seqnに変更が加えられたためにMATLABがこのPARFORループを実行しないことです。私は理由を理解していない!私がiterに行うことは、seqnと本質的に同じです。それは、ネストされたWHILEループ内で実行され、以前の繰り返しに依存しないという意味でです。

これを解決するにはどうすればよいですか?

+1

[MATLABの従業員によるこの解答](http://stackoverflow.com/a/37696213/5211833:今MATLABあなたがそれを実行するが、私はそれはあなたが望んだか分からないので、見てみましょう)あなたを助けるかもしれない、それはあなたが望むものと同じであるように見えます。一般的な 'parfor'のヒントは、[この私の答え](http://stackoverflow.com/questions/32146555/saving-time-and-memory-using-parfor-in-matlab/32146700#32146700)にあります。 (ここでは他のコメントを削除します。半分は間違っていると答えています。ここでは答えがありますが、ちょっと整理してください) – Adriaan

答えて

1

forループをforループに変更し、最終値をiterに変更しました。さらに私はあなたのように列全体の代わりにseqnの要素を1つだけ設定しています。

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'ではなく' for'ループで素晴らしいアイデアです!私は最初にそれを拒否しました。なぜなら、何回繰り返す必要があるのか​​分からなかったからです。しかし、すべての証拠(10^8まで)は、10^6が十分であることを示しています。私は私のマシンにアクセスして戻ってくるときにこれをチェックします:) – Gallifreyan

+0

... aaaと私のラップトップはほとんどクラッシュしました:D RAMの使用量が最大(8Gb)になりました。しかし、理由を見ることはできません。 – Gallifreyan

+0

ああ、それはおそらく事前割り当てです - 'uint32'と' uint64'はあまりにも多くのRAMを食べます。 – Gallifreyan

関連する問題