【问题标题】:removing second layer for loop when defining array定义数组时删除第二层 for 循环
【发布时间】:2018-05-22 21:31:38
【问题描述】:

在 MATLAB R2017a 中工作。我正在尝试优化我正在处理的一段代码。它使用数组将字段值存储在网格上。 为了在字段数组中创建特定函数,我最初使用两个 for 循环迭代所有数组元素的直接方法。但我知道 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 循环进行矢量化,但我不知道如何使用数组操作符区分维度。

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

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

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

【问题讨论】:

  • 如果您至少定义了所有变量的大小会有所帮助。这与complete example 相差甚远。
  • 抱歉,我显然解释得不够清楚。 THzamp、stepuppos、bx、bt、THzstartz、THzstartx 都是标量,它们控制着我试图创建的函数 (Ez0)。 dX 和 t 也只是标量。 Ez0 是一个大小为 Ng 的方形数组,我想要实现的是删除循环 k 的 for 循环,以便 ztemp 的值定义在一个向量中(就像 xtemps 已经是),而不是单独在循环中.但是,我不知道在这种情况下如何编写 Ez0 的定义。 (如果不给你我的整个代码,我不知道如何把它变成一个完整的例子,对不起)
  • 我刚刚阅读了有关完整示例的链接。我大概可以创造出类似的东西。不幸的是,我只能在工作中使用 matlab,所以它必须等到星期二。 ://

标签: arrays matlab loops for-loop 2d


【解决方案1】:

不清楚n 是否在其他标题中使用,并且如 cmets 中所述,您的尺寸未正确定义,因此您必须确保尺寸正确。

不过,您可以试试这个矢量化代码。

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

【讨论】:

  • 抱歉,我显然解释得不够清楚。 THzamp、stepuppos、bx、bt、THzstartz、THzstartx 都是标量,它们控制着我试图创建的函数 (Ez0)。 dX 和 t 也只是标量。 Ez0 是一个大小为 Ng 的方形数组,我想要实现的是删除循环 k 的 for 循环,以便 ztemp 的值定义在一个向量中(就像 xtemps 已经是),而不是单独在循环中.但是,我不知道如何在 tat case 中编写 Ez0 的定义。
猜你喜欢
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2012-11-26
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多