首页 > 解决方案 > matlab修复切片以执行parfor

问题描述

只是从平行的东西开始......

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

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

简单地转换forin aparfor甚至不会运行

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 在 parfor 函数中运行循环,方法是将循环迭代分成组,然后将它们发送给并行运行的 MATLAB 工作程序。为了使 MATLAB 以可重复、可靠的方式执行此操作,它必须能够对循环中使用的所有变量进行分类。该代码以与分类不兼容的方式使用指示的变量。

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

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

如何索引A以存储数组?

标签: matlabparallel-processingparfor

解决方案


您不能部分更改 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

推荐阅读