并行化MATLAB实现回路最大似然估计的计算

并行化MATLAB实现回路最大似然估计的计算,matlab,parallel-processing,parfor,mle,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*o

我试图通过使用
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进行分类。'


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

只需将其作为单独的维度

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

请注意,Matlab不允许嵌套PARFOR。但是,如果
N
大于工人数量,则也不需要它们。另见

正如@Trilarion所说,你的
pd
确实是你所犯错误的罪魁祸首。可能
ld
也不太好,语法相同,所以也要初始化它。之所以发生这种情况,是因为在执行之前,您希望知道循环中所有变量的大小。MATLAB不知道这是一个固定的最大大小,因为您正在使用循环变量“更改”大小

也许你在这两条线(如拼写检查错误)下有“橙色摆动”,当你用< <代码> > 循环时,说“Pd看起来在每次迭代中都在变大。请考虑预分配速度”。这是parfor所要求的,因为迭代的顺序不是顺序的,所以不可能以这种方式增长数组

其次,不能嵌套
parfor
循环。您可以使用带有
parfor
的函数,并在
parfor
中运行该函数,但这并不能加快速度,因为您已经在使用所有的worker


有关
parfor
的更多一般信息,请参阅,尤其是关于速度的信息。

ld也是如此。@Adrian说有4-8名工人,N可能大于此,询问者无论如何不需要第二个parfor。但他仍然需要扩展pd和ld的维度,以使外部parfor工作。这似乎解决了问题。我确实有一个后续问题:当我打印
max(ld)
时,它会打印两次最大值,即
-746.8349-746.8349
。您能解释一下原因吗?@user3603290如果您有一个新问题与此问题完全不同,请提问。如果这篇文章中的一个答案解决了你的问题,那么请考虑。我需要初始化<代码> Pd < /代码>和<代码> LD 里面的代码> PAROF/<代码>循环,而不是外部。哼,不,确实你需要在外面初始化它们,我的坏,我会更新帖子。<代码> n*(i-1)+j不大于<代码> n*n < /代码>,因此,变量的大小没有增长。只是Matlab对此并不确定。@Trilarion这正是我要说的。
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