Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在fortran中用零填充数组而不使用循环_Fortran_Gfortran_Fortran90_Fortran95 - Fatal编程技术网

在fortran中用零填充数组而不使用循环

在fortran中用零填充数组而不使用循环,fortran,gfortran,fortran90,fortran95,Fortran,Gfortran,Fortran90,Fortran95,我有两个数组,我想比较它们的大小,并将尾随的零添加到更短的数组中 eg-For阵列- y1=(/ 1,2,3 /) y2=(/ 1,2,3,4,5 /) 最终结果应为—— y1=(/ 1,2,3,0,0 /) y2=(/ 1,2,3,4,5 /) 我对Fortran非常陌生,据我所知,到目前为止,可以这样做:- integer, allocatable :: y1(:),y2(:) integer :: l1,l2,i . . . ! some code to generate y1 and

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

eg-For阵列-

y1=(/ 1,2,3 /)
y2=(/ 1,2,3,4,5 /)
最终结果应为——

y1=(/ 1,2,3,0,0 /)
y2=(/ 1,2,3,4,5 /)
我对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
我想知道是否有更好的方法,最好是不涉及循环的方法,因为我正在研究的实际问题可能有巨大的向量,这里有一种方法:

y1 = RESHAPE(y1,SHAPE(y2),pad=[0])
没有显式循环。正如@VladimirF评论的那样,必须重新分配较短的数组,这种方法将由编译器和运行时负责


如果您关心这种方法的性能,或者关心它在使用显式循环的版本中的性能,并且关心性能如何随数组大小扩展,那么请运行一些测试。如果我发现显式重新分配和一两个循环比这种“聪明”的方法要快,我不会感到惊讶。

如果你只关心排名1的数组,那么使用
形状和
重塑
就太过了。只需使用Fortran的数组构造函数功能。您还可以使用现代Fortran的分配时分配功能,因此不需要重新分配较短的数组

program foo
  implicit none
  integer, allocatable :: y1(:),y2(:)
  integer :: l1,l2,i
  y1 = [1, 2, 3]
  y2 = [1, 2, 3, 4, 5]
  l1 = size(y1)
  l2 = size(y2)
  if (l1 > l2) y2 = [y2, [(0,i=1,l1-l2)]]
  if (l2 > l1) y1 = [y1, [(0,i=1,l2-l1)]]
  print '(10(I0,1X))', y1
  print '(10(I0,1X))', y2
end program foo

首先,必须重新分配较短的数组。它是可分配的吗?它是如何定义的?是的,它们是可分配的。我将编辑这个问题。我认为变量声明是不必要的。请记住,在现代Fortran中(我认为自2003年以来),可以使用方括号数组构造函数,如:
y1=[1,2,3]
,而不是更旧的
(//)
。我不知道这一点。非常感谢。不过我使用的是f95扩展。到目前为止我只知道这些now@Steve嗯,任务的再分配仍然是我的钱的再分配。我在写我的评论时很清楚这种可能性。谢谢你的回答。我还没有在任何真实的数据集上测试过任何东西。但是谢谢你的建议。我将测试这两种方法,看看哪一种在性能方面更好这个答案正是我想要的,所以我认为我应该接受它。它完全符合我的要求,填充阵列。可能还有其他方法,但从技术上讲,这正是我所要求的。不过我会检查性能。我实际上在1000到50000000的不同大小的数据集上运行了一个测试,数组大小的差异在10到9000000之间。一般来说,在我的所有测试中,显式分配、取消分配和循环大约快60%。感谢更新。它证实了我的一般观点,即显式循环比整洁的整个数组更快,但拥有数据总是很好。@Yuki.kuroshita:在许多解释语言中,如matlab、python/numpy、R,数组操作更快,因为这样可以避免显式循环的解释器开销。在Fortran中,它都编译成机器代码,所以您应该使用最清晰的代码。数组语法是天赐良机,它使许多常见的操作变得简单而简短,但您不需要做一些非常棘手的事情来避免性能下降。如果一个算法更清楚地表达为一个显式循环,那么就这样做吧。有一个更短的程序,可能只需要很少的计算工作。删除
if(l1>l2)
if(l2>l1)
。生成的带有隐含do循环的数组构造函数将做正确的事情。