定义数组时删除第二层for循环

时间:2017-12-08 15:47:42

标签: arrays matlab loops for-loop 2d

在MATLAB R2017a中工作。我正在尝试优化我正在处理的一段代码。它使用数组在网格上存储字段值。 为了在字段数组中创建特定的函数,我最初使用两个for循环方法迭代遍历所有数组元素。但是我知道循环很慢所以从那以后我回来并尽力去掉它们。但是我只能设法删除其中一个循环;离开我这个:

for n = 1:1:K

%%% define initial pertubation 

t=n*dt;

% create array for source Ez field.

xtemps = (1:Ng)*dX;

for k = 1:Ng

    ztemp = k*dX;

    Ez0(k,:) = THzamp * (1/(1+exp(-(t-stepuppos)))) * exp(-((xtemps-...
    THzstartx).^2)./(bx^2)) .* (t-((ztemp-THzstartz)/vg))*exp(-((t-((ztemp-...
    THzstartz)/vg))^2)/(bt^2));

end

这里重要的一点是最后5行,但我认为之前的内容可能对上下文很重要。我已经删除了在x坐标上循环的for循环。我想矢量化z / k for循环,但我无法弄清楚如何用数组oporators来区分尺寸。

编辑:THzamp,stepuppos,bx,bt,THzstartz,THzstartx都只是标量,他们控制我正在尝试创建的函数(Ez0)。 dX和t也只是标量。 Ez0是一个大小为Ng的正方形阵列。

我想要实现的是删除循环遍历k的for循环,以便ztemp的值在向量中定义(如xtemps已经是),而不是在循环中单独定义。但是,在这种情况下,我不知道如何编写Ez0的定义。

第一次在这里发帖,如果我做错了,请告诉我。如果您需要更多信息,请询问。

1 个答案:

答案 0 :(得分:0)

不清楚n是否在其他标题中使用,并且评论中说明您的尺寸未正确定义,因此您必须确保尺寸正确

但是,您可以试试这个矢量化代码。

n = 1:K

%%% define initial pertubation 

t=n*dt;

% create array for source Ez field.

xtemps = (1:Ng)*dX;

for k = 1:Ng

    ztemp = k*dX;

    Ez0(k,:) = THzamp .* (1./(1+exp(-(t-stepuppos)))) .* exp(-((xtemps-...
    THzstartx).^2)./(bx^2)) .* (t-((ztemp-THzstartz)/vg)).*exp(-((t-((ztemp-...
    THzstartz)/vg)).^2)/(bt.^2));

end

现在t的大小为K,您需要确保stepuppos(ztemp-THzstartz)/vg)具有相同的尺寸K。您还可以查看向量与数组运算符here