arrayfun中的统一输出错误中的非标量。怎么修?

时间:2015-05-23 01:14:52

标签: arrays matlab operators output

我不确定在这种情况下它意味着什么。我尝试添加" ' uniformoutput',false"到了arrayfun的末尾,但是它对" +"感到不安。操作员说"未定义的操作符' +'对于类型' cell'的输入参数。" 我将其更改为"。+"但得到了一个解析错误:(做错了什么?

这是一个被破坏的部分和错误的图像。如果有人想尝试运行它或复制损坏的部分,整个代码就在下面。

enter image description here

整个代码:

    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

所以我不确定我的代码有什么问题。

1 个答案:

答案 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)))