我正在使用parfor
,不幸的是,我的两个变量x
和y
都是矩阵,被广播并且不知道如何避免。我已经在MATLAB帮助中阅读了有关此内容的信息,但找不到解决方案。如何防止广播x
和y
?
这是我的代码:
parfor k=1:length(Lambda)
lambda=Lambda(k);
for p=1:length(Gamma)
gamma=Gamma(p);
for Fold=1:size(Fold_indices,2)
x_Train=x(logical(Fold_indices(:,Fold)),1:end);
Y_Train=y(logical(Fold_indices(:,Fold)),1:Num_Tasks);
% Do sth with x_Train and Y_train
end
end
end
我试图将广播的数据(x)切成一个单元阵列,但这并不能很好地解决问题。
B=cell(1,J);
% Fill each entry of B with a matrix
% ...do it here
....
parfor k=1:length(Lambda)
lambda=Lambda(k);
for p=1:length(Gamma)
gamma=Gamma(p);
for Fold=1:J)
x_Train=B{1,J};
% Do sth with x_Train and Y_train
end
end
end
有趣的是,当我将broadacaste变量(B)分配给其他变量(D)时,它不再被溴化。
B=cell(1,J);
% Fill each entry of B with a matrix
% ...do it here
....
parfor k=1:length(Lambda)
D=B;
lambda=Lambda(k);
for p=1:length(Gamma)
gamma=Gamma(p);
for Fold=1:J)
x_Train=B{1,J};
% Do sth with x_Train and Y_train
end
end
end
答案 0 :(得分:1)
首先,您需要进行广播。每个工作程序都是一个单独的MATLAB实例,并且需要数据。将数据发送到工作人员的MATLAB实例称为广播。因此,在使用并行计算时并不能阻止它,甚至是它的核心。
第二:您不能避免在此处完整广播x
和y
,因为您在每个单独的parfor
迭代中都使用了它们。要避免整体广播,就不需要您在每次循环迭代中都使用所有矩阵,在这种情况下,您可以对变量进行切片,如this answer中所述;也就是说,您必须以不需要所有x
和y
都在每个单独的工作人员上的方式来重写代码。