我有两个数组,我想比较它们的大小并将尾随零添加到较短的数组中。
eg-对于数组-
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
我想知道是否有更好的方法可以做到这一点,最好是不涉及循环的方法,因为我正在研究的实际问题可能有巨大的向量
答案 0 :(得分:4)
这是一种方法:
y1 = RESHAPE(y1,SHAPE(y2),pad=[0])
无显式循环。正如@VladimirF所说,必须重新分配较短的数组,这种方法将其留给编译器和运行时来解决。
如果您担心这种方法的性能,或者担心它的性能 wrt 使用显式循环的版本,并且担心性能如何随数组大小扩展,那么请运行一些测试。发现显式重新分配和一两个循环比这种“聪明”的方法更快,我不会感到惊讶。
答案 1 :(得分:2)
如果仅关注第1级数组,则使用SHAPE
和RESHAPE
可能会过分。只需使用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