在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的定义。
第一次在这里发帖,如果我做错了,请告诉我。如果您需要更多信息,请询问。
答案 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。