首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行MATLAB循环计算MLE

并行MATLAB循环计算MLE
EN

Stack Overflow用户
提问于 2015-11-03 10:13:57
回答 2查看 198关注 0票数 1

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

下面是代码片段:

代码语言:javascript
复制
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不能分类。”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-03 10:30:56

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2015-11-03 10:24:56

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

只是把它作为独立的维度

代码语言:javascript
复制
pd = zeros(n, N, 2);
...
  % in the loop
  pd(i, j, :) = p;

那就行了。

请注意,Matlab不允许嵌套parfors。但是,如果N大于工作人员的数量,您也不需要它们。也见文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33496463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档