【问题标题】:matlab fix slicing to execute parformatlab修复切片以执行parfor
【发布时间】:2018-07-12 07:20:39
【问题描述】:

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

我有一个代码可以归结为用可变长度数组填充矩阵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 通过划分循环迭代在 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 以存储数组?

【问题讨论】:

    标签: matlab parallel-processing parfor


    【解决方案1】:

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

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

      如果您尝试使用固定的 hmy,那就没问题了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        相关资源
        最近更新 更多