在matlab

时间:2018-03-17 05:50:52

标签: matlab parfor

   parfor i=1:10
   k1=0.30+(0.35/20)*i
   AX(i)=k1;
   for j=1:10
      k2=0.5+(.35/20)*j
       AY(i,j)=k2;
     wph(i,j)=wph1(k1,k2)
     end 
     end   

其中wph1(k1,k2)是用于计算声子能量的自定义函数。但是当我尝试运行此代码时,我遇到了错误:

  

错误:对于' wph'工作人员抛出了UndefinedFunction错误。   这可能是因为包含' wph'无法访问   工人。使用addAttachedFiles(pool,files)来指定   要附加的文件。请参阅文档   ' parallel.Pool / addAttachedFiles'了解更多详情。

     

yorraman(第7行)的错误parfor i = 1:10

     

引起:       未定义的功能' wph'输入参数类型为' double'。"

如何解决这个问题?请帮忙。

1 个答案:

答案 0 :(得分:0)

你得到的是小错误,而不是pk1pk2p*k1p*k2。 此外,在matlab中,您已经定义了pi,因此您的代码应该是

tic
parfor i=1:10
    k1=0.30+(0.35/20)*i
    AX(i)=k1;
    for j=1:10
        k2=0.5+(.35/20)*j
        AY(i,j)=k2;
        wph(i,j)=wph1(k1,k2);
    end
end
toc

function u = wph1(k1,k2) 
    u = 2*cos(2*pi*k1) + 2*cos(2*pi*k2) + 2*cos(2*pi*(k1 - k2)); 
end

其他重要提示,对于这种情况,请使用'for'而不是'parfor',除非每个函数调用运行时间超过半秒,否则您的代码运行速度会变慢,只需设置并调用parfor就像10- 50毫秒。

现在为了魔术。在matlab中,你根本不需要循环来进行这种计算,因此最快的代码是:

tic
i=1:10; k1=0.30+(0.35/20)*i; AX=k1;
j=1:10; k2=0.50+(0.35/20)*j'; AY=k2;
wph=wph1(k1,k2);
toc
% bonus: plot
[X,Y] = meshgrid(AX,AY);
surf(X,Y,wph)

function u = wph1(k1,k2) 
    u = 2*cos(2*pi*k1) + 2*cos(2*pi*k2) + 2*cos(2*pi*(k1 - k2)); 
end