Matlab修复切片以执行parfor

时间:2018-07-12 07:20:39

标签: matlab parallel-processing parfor

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

我有一个代码可以归结为用可变长度的数组填充矩阵A(已预先分配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

仅在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通过划分循环迭代来在parfor函数中运行循环   分组,然后将它们发送给在其中运行的MATLAB worker   平行。为了使MATLAB以可重复,可靠的方式执行此操作,   必须能够对循环中使用的所有变量进行分类。代码   使用指示变量的方式与   分类。

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

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

如何索引A以便存储数组?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

如果您尝试使用固定的hmy,则可以。