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'。"
如何解决这个问题?请帮忙。
答案 0 :(得分:0)
你得到的是小错误,而不是pk1
和pk2
写p*k1
和p*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