我试图通过使用parfor来加速我的MATLAB代码,但是我做的不对。我的代码相当简单,我使用MATLAB内置的mle函数对一些数据进行拟合,使用了均值(mm)和方差(vv)的不同初始猜测。onestagepdf2是我的概率密度函数。
下面是代码片段:
mm=linspace(.1, 1, 2); % mean
vv=linspace(.1, 2, 2); % variance
N=length(mm);
n=length(vv);
pd=zeros(n*N,2);
ld = NaN*ones(n*N,1);
options = statset('MaxIter',10000, 'MaxFunEvals',10000);
parfor i=1:N % pick a mean
m=mm(i);
parfor j=1:n % pick a variance
v=vv(j);
x0=[m,v];
[p,conf1]=mle(data,'pdf',@onestagepdf2,'start',x0, 'upperbound', [Inf Inf],'lowerbound',[0 0],'options',options)
pd(n*(i-1)+j,:)=p; % store parameter values from mle
l=onestagepdf2(data,p(1),p(2)); % evaluate pdf with parameter values
ld(n*(i-1)+j)=sum(log(l)); % store likelihood value
end
end我收到的错误是:
“parfor中的变量pd不能分类。”
发布于 2015-11-03 10:30:56
pd = zeros(n, N, 2); %initialise culprits
ld= zeros(n,N);
parfor ii=1:N % pick a mean
m=mm(ii);
for jj=1:n % Parallellise the second parfor
v=vv(jj);
x0=[m,v];
[p,conf1]=mle(data,'pdf',@onestagepdf2,'start',x0, 'upperbound', [Inf Inf],'lowerbound',[0 0],'options',options)
pd(ii, jj, :) = p;=p; % store parameter values from mle
l=onestagepdf2(data,p(1),p(2)); % evaluate pdf with parameter values
ld(ii,jj)=sum(log(l)); % store likelihood value
end
end正如@Trilarion所说,你的pd确实是你所犯错误的罪魁祸首。使用相同的语法,ld可能也不太好,所以也要初始化它。之所以发生这种情况,是因为parfor想知道循环中所有变量在执行之前的大小。MATLAB不知道这是一个固定的最大大小,因为您正在使用循环变量来“更改”大小。
可能在这两行(比如拼写检查错误)下面有“橙色摆动”(比如拼写检查错误),当您将其作为for循环运行时说:“每次迭代时,pd的大小似乎都在增长。请考虑为速度预先分配”。这是parfor所要求的,因为迭代的顺序不是连续的,所以不可能以这种方式增长数组。
其次,不能嵌套parfor循环。您可以使用类似于parfor的函数,并在parfor中运行它,但这不会加快速度,因为您已经使用了所有的工作人员。
有关parfor的更多一般信息,特别是关于速度的信息,请参见parfor。
发布于 2015-11-03 10:24:56
您需要一个切片的输出变量,但是Matlab不够聪明,无法检测到n*(i-1)+j实际上是合理的,并且不会干扰异步计算。
只是把它作为独立的维度
pd = zeros(n, N, 2);
...
% in the loop
pd(i, j, :) = p;那就行了。
请注意,Matlab不允许嵌套parfors。但是,如果N大于工作人员的数量,您也不需要它们。也见文档。
https://stackoverflow.com/questions/33496463
复制相似问题