只是从并行的东西开始...
我有一个代码可以归结为用可变长度的数组填充矩阵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
以便存储数组?
答案 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,则可以。