1

我有一些看起来像这样的代码:

DO I=0,500
    arg1((I*54+1):(I*54+54)) = premultz*sinphi(I+1)
ENDDO

简而言之,我有一个维度为 54 的数组 premultz。我有一个维度为 501 的数组 sinphi。我想将 sinphi 的第一个值乘以 premultz 的所有条目,并将其存储在 arg1 的前 54 个条目中,然后sinphi 的第二个值乘以 premultz 的所有条目并将其存储在 arg1 的 second54 个条目中,依此类推。

这些是扁平矩阵。为了速度,我将它们展平,因为这个项目的主要目标之一是非常快的代码。

我的问题是:在 Fortran90 中编码这种计算是否有更有效的方法?我知道 Fortran 有很多漂亮的数组操作可以完成,但我并不完全了解。

提前致谢。

4

1 回答 1

0

这个表达式,如果我做对了,应该arg1在一个语句中创建

arg1 = reshape(spread(premultz,dim=2,ncopies=501)*&
              &spread(sinphi,dim=1,ncopies=54),[1,54*501])

我在这里硬连线了尺寸,可能适合也可能不适合您的目的。内部表达式生成 和 的外部乘积,premultz然后sinphi将其重新整形为向量。你可能会发现你需要重塑外部产品的转置,我没有仔细检查过。

但是,根据我对 Fortran 数组内在函数的这种巧妙使用的经验,我怀疑这种或 Fortran 数组内在函数的大多数其他巧妙用法会胜过您已经拥有的简单循环实现。对于其中许多操作,编译器将生成数组的副本,并且复制数据相对昂贵。当然,这是您可能想要测试的断言。

我将由您来决定单行是否比循环更易于理解。有时,数组语法的表现力是以可接受的性能成本为代价的,有时则不然。

于 2013-01-21T15:49:19.147 回答