matlab修复切片执行parfor

matlab fix slicing to execute parfor

刚从并行的东西开始...

我有一个代码可以归结为用可变长度的数组填充矩阵 A(预先分配给 NaNs)的列:

A = nan(100);
for ii=1:100
    hmy = randi([1,100]); %lenght of the array 
    A(1:hmy,ii) = rand(hmy,1); %array
end

简单地将 for 转换为 parfor 甚至 运行

parfor ii=1:100
    hmy = randi([1,100]); %how many not NaN values to put in 
    A(1:hmy,ii) = rand(hmy,1);
end

因为 parfor 不喜欢索引:

MATLAB runs loops in parfor functions by dividing the loop iterations into groups, and then sending them to MATLAB workers where they run in parallel. For MATLAB to do this in a repeatable, reliable manner, it must be able to classify all the variables used in the loop. The code uses the indicated variable in a way that is incompatible with classification.

我认为这是由于第一个维度上的索引造成的,并尝试了一种无效的解决方法(与以前相同的错误消息):

parfor ii=1:100
    hmy = randi([1,100]);
    tmp = [rand(hmy,1); NaN(size(A,1)-hmy,1)];
    A(:,ii) = tmp;
end

如何索引 A 以存储数组?

您不能部分更改 A 中的行或列数据。您必须在 parfor 中执行整行或整列。这是更新后的代码。

A = nan(100);
parfor ii=1:100
    hmy = randi([1,100]); %lenght of the array 
    temp = nan(1,100);
    temp(1:hmy) = rand(hmy,1); %array
    A(:,ii) = temp; %updating full row of iith column
end

首先,在 parfor 的情况下,输出变量(在本例中为 A)将是一个切片变量。这意味着这个变量将被分成不同的部分以进行并行计算。切片变量中的索引形式对于所有事件都应该相同。在这里,您正在创建一个随机数 (hmy) 并使用 (1:hmy) 作为不时变化的索引。这就是为什么你的输出变量不能被切片并且你有错误的原因。

如果你用一个固定的hmy试试,那就没问题了。