在不使用循环的情况下在 fortran 中用零填充数组

Yuk*_*ita 2 fortran gfortran fortran90 fortran95

我有两个数组,我想比较它们的大小并将尾随零添加到较短的数组。

例如-对于数组-

y1=(/ 1,2,3 /)
y2=(/ 1,2,3,4,5 /)
Run Code Online (Sandbox Code Playgroud)

最后的结果应该是——

y1=(/ 1,2,3,0,0 /)
y2=(/ 1,2,3,4,5 /)
Run Code Online (Sandbox Code Playgroud)

我对 Fortran 很陌生,据我所知,到目前为止,可以这样做:-

integer, allocatable :: y1(:),y2(:)
integer :: l1,l2,i
.
.
.
! some code to generate y1 and y2 here
.
.
.
l1=size(y1)
l2=size(y2)

if (l1>l2) then
    do i=l2+1,l1
        y2(i)=0
    enddo
else if (l2>l1) then
    do i=l1+1,l2
        y1(i)=0
    enddo
endif
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来做到这一点,最好是不涉及循环的方法,因为我正在处理的实际问题可能有很大的向量

Hig*_*ark 5

这是一种方法:

y1 = RESHAPE(y1,SHAPE(y2),pad=[0])
Run Code Online (Sandbox Code Playgroud)

没有显式循环。正如@VladimirF 评论的那样,必须重新分配较短的数组,这种方法将它留给编译器和运行时来处理。

如果你正在关注这个方法的性能,或关心它的性能WRT使用显式循环的一个版本,并关注与数组的大小表现尺度如何,然后再运行一些测试。我不会惊讶地发现显式重新分配和一两个循环比这种“聪明”的方法更快。

  • @Yuki.kuroshita:在许多解释型语言中,例如 matlab、python/numpy、R,数组操作更快,因为这样可以避免显式循环的解释器开销。在 Fortran 中,所有内容都编译为机器代码,因此您应该使用最清晰的内容。数组语法是天赐之物,它使许多常见的操作变得简单而简短,但您不需要做一些超级棘手的事情来避免掉下性能悬崖。如果一个算法更清楚地表达为显式循环,那就这样做吧。 (3认同)
  • 感谢更新。它证实了我的普遍观点,即显式循环比整洁的全数组替代方案更快,但拥有数据总是好的。 (2认同)