并行化MATLAB for循环以计算MLE

时间:2015-11-03 10:13:57

标签: matlab parallel-processing parfor mle

我试图使用parfor来加速我的MATLAB代码,但是,我做错了。我的代码相当简单,我使用MATLAB的内置mle函数来拟合一些数据,方法是对均值(mm)和方差(vv)使用不同的初始猜测。 onestagepdf2是我的概率密度函数。

以下是代码snippit:

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无法分类。'

2 个答案:

答案 0 :(得分:2)

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

你的pd确实是罪魁祸首,正如@Trilarion所说的,因为你得到的错误。可能ld也不是太大,语法相同,所以也要初始化。发生这种情况是因为parfor想要知道在执行之前循环中所有变量的大小是。这是一个固定的最大尺寸,MATLAB是未知的,因为你正在使用循环变量来改变"大小。

可能你有"橙色的摇摆"当你以for循环运行它时,在这两行(如拼写检查错误)之下,表示" pd似乎每次迭代都在增长。请考虑预先分配速度"。 parfor这是必需的,因为迭代的顺序不是连续的,所以不可能以这种方式增长数组。

其次,你不能嵌套parfor循环。您可以使用parfor之类的功能,并在parfor内运行,但由于您已经在使用所有工作人员,因此无法让您加速。

有关parfor的更多一般信息,请参阅Saving time and memory using parfor in Matlab?,特别是有关速度的信息。

答案 1 :(得分:1)

你想要一个切片的输出变量,但是Matlab不够聪明,无法检测到n*(i-1)+j实际上是否合理,并且不会干扰异步评估。

只需将其作为单独的维度

pd = zeros(n, N, 2);
...
  % in the loop
  pd(i, j, :) = p;

这将有效。

请注意,Matlab不允许嵌套parfors。但是,如果N大于工作人员数量,您也不需要它们。另请参阅documentation