我不确定在这种情况下它意味着什么。我尝试添加" ' uniformoutput',false"到了arrayfun的末尾,但是它对" +"感到不安。操作员说"未定义的操作符' +'对于类型' cell'的输入参数。" 我将其更改为"。+"但得到了一个解析错误:(做错了什么?
这是一个被破坏的部分和错误的图像。如果有人想尝试运行它或复制损坏的部分,整个代码就在下面。
整个代码:
function gbp2(zi,zf)
global beam xlist ylist wi qi Ri wf qf Rf Psii Psif x n
beam = struct('E',[],'lambda',[],'w',[],'R',[],'q',[],'a',[]);
E = 1; % electric field
lambda = 1064*10^-9; % wavelength
k = 2*pi/lambda; % wave number
wi = 10^-3; % initial waist width (minimum spot size)
zr = (pi*wi^2)/lambda; % Rayleigh range
Ri = zi + zr^2/zi;
qi = 1/(1/Ri-1i*lambda/(pi*wi^2)); % initial complex beam parameter
Psii = atan(real(qi)/imag(qi)); % Gouy phase
mat = [1 zf; 0 1]; % transformation matrix
A = mat(1,1); B = mat(1,2); C = mat(2,1); D = mat(2,2);
qf = (A*qi + B)/(C*qi + D);
wf = sqrt(-lambda/pi*(1/imag(1/qf)));
Rf = 1/real(1/qf);
u = @(z, coor, mode, w, R, Psi) (2/pi)^(1/4)*sqrt(exp(1i*(2*mode+1)*Psi)/(2^mode*factorial(mode)*w))*...
hermiteH(mode,sqrt(2)*coor/w)*exp(-coor^2*(1/w^2+1i*k/(2*R))-1i*k*z);
% -------------------- ERROR IN THIS PIECE (below) ----------------------------
xlist = containers.Map('KeyType','double','ValueType','any');
ylist = containers.Map('KeyType','double','ValueType','any');
function pts(z, w, R, Psi)
xlist(z) = -2*w:10^-4:2*w;
ylist(z) = zeros(1,size(xlist(z),2));
for mode = 0:2:10
ylist(z) = ylist(z) + arrayfun(@(coor) u(z, coor, mode, w, R, Psi),xlist(z),'uniformoutput',false);
end
end
pts(zi,wi,Ri,Psii)
pts(zf,wf,Rf,Psif)
plot(xlist(zi),ylist(zi),xlist(zf),ylist(zf)) end
我尝试编写一个类似但更简单的函数,它似乎工作得很好:
function test(zi, zf)
u = @(z,coor,mode) z*mode + integral(@(coor)coor,0,1);
xlist = containers.Map('KeyType','double','ValueType','any');
ylist = containers.Map('KeyType','double','ValueType','any');
function pts(z)
xlist(z) = -5:5;
ylist(z) = zeros(1,size(xlist(z),2));
for mode = 0:2:10
ylist(z) = ylist(z) + arrayfun(@(coor) u(z,coor,mode),xlist(z));
end
end
pts(zi)
pts(zf)
plot(xlist(zi),ylist(zi),xlist(zf),ylist(zf))
end
所以我不确定我的代码有什么问题。
答案 0 :(得分:1)
错误消息为您提供了一个很大的提示:
未定义的运算符'+'表示'cell'类型的输入参数。
gbp2 / pts 中的错误(第36行)
ylist(z)= ylist(z)+ arrayfun(@(coor)u(z,coor,mode,w,R,
PSI)的Xlist(Z) '' uniformoutput”,假);
来自arrayfun
和'UniformOutput'
选项的文档:
请求 arrayfun 函数将输出组合成单元格数组 B1,...,Bm 。函数 func 的输出可以是任何大小或类型。
实际上,如果你检查,这一行的输出是一个单元格数组:
arrayfun(@(coor) u(z, coor, mode, w, R, Psi),xlist(z),'uniformoutput',false)
您无法直接对单元格数组中的值求和。以下是您可以采用以下几种方法之一:
v = arrayfun(@(coor) u(z, coor, mode, w, R, Psi),xlist(z),'uniformoutput',false);
ylist(z) = ylist(z) + [v{:}];
但是,我不明白为什么你需要使用'UniformOutput'
选项甚至慢速arrayfun
。只需根据coor
u = @(z, coor, mode, w, R, Psi)(2/pi)^(1/4)*sqrt(exp(1i*(2*mode+1)*Psi)/(2^mode*factorial(mode)*w))*...
hermiteH(mode,sqrt(2)*coor/w).*exp(-coor.^2*(1/w^2+1i*k/(2*R))-1i*k*z);
现在
ylist(z) = ylist(z) + u(z, xlist(z), mode, w, R, Psi);
一些其他建议:Don't use global
个变量 - 它们是inefficient并且几乎总是有更好的解决方案。如果pts
意味着是嵌套函数,那么您错过了主end
函数的结束gbp2
。重命名变量mode
可能是个好主意,这样它就不会重载同名的内置函数。 Psif
未定义。 zeros(1,size(xlist(z),2))
可以简单地写成zeros(size(xlist(z)))
。