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

时间:2017-04-02 10:41:05

标签: matlab while-loop nested-loops parfor

我有一个代码,用于计算将数字的Collat​​z序列聚合为一个所需的迭代:

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

很快,它会为每个数字计算Collat​​z序列,最多为num,记录序列中的最大数量,并记录将数量减少为1的迭代次数。

使用seqn矩阵,我正在尝试记录我运行循环的每个数字的Collat​​z sequnece。

问题在于,由于对PARFOR所做的更改,MATLAB不会运行此seqn循环。我不明白原因!在我看来,我对iter的所作所为与seqn基本相同,因为它在嵌套的WHILE循环内执行并且不依赖于先前的迭代。

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分: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