matlab修复切片执行parfor
matlab fix slicing to execute parfor
刚从并行的东西开始...
我有一个代码可以归结为用可变长度的数组填充矩阵 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
因为 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试试,那就没问题了。
刚从并行的东西开始...
我有一个代码可以归结为用可变长度的数组填充矩阵 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
因为 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试试,那就没问题了。