代码之家  ›  专栏  ›  技术社区  ›  shamalaia

Matlab修复执行parfor的切片

  •  1
  • shamalaia  · 技术社区  · 6 年前

    从平行的东西开始…

    我有一个代码可以归结为填充矩阵的列 A (与 NaN s)具有可变长度数组:

    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
    

    因为PAROF不喜欢索引:

    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
    

    如何编制索引 一个 为了存储数组?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Rijul Sudhir    6 年前

    不能部分更改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
    
        2
  •  1
  •   amahmud    6 年前

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

    如果你试着用固定的头盔,那就没问题了。