私は1に番号のこのCollatzシーケンスを収束させるために必要な反復を計算するために使用したコードがあります。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
までの各番号についてこのCollatzシーケンスを計算し、最大数を記録シーケンスを作成し、数を1に減らすために必要な繰り返し回数を記録します。
seqn
の行列では、ループを実行する各数値のCollatz sequneceを記録しようとしています。
ここでの問題点は、seqn
に変更が加えられたためにMATLABがこのPARFOR
ループを実行しないことです。私は理由を理解していない!私がiter
に行うことは、seqn
と本質的に同じです。それは、ネストされたWHILE
ループ内で実行され、以前の繰り返しに依存しないという意味でです。
これを解決するにはどうすればよいですか?
[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