我正在尝试编写一个子程序,可以将一维数组或二维数组作为输入。如何声明子例程的输入可以是向量还是矩阵?
如果我这样做:
SUBROUTINE TEST1(x)
REAL, INTENT(IN) :: x(:)
<do something>
END SUBROUTINE TEST1
我显然不能在子程序中传递矩阵作为输入。一个不优雅的解决方案可能是以矢量化形式传递矩阵,然后在子程序内以矩阵形式重新排列(当然,我需要一些额外的输入)。有没有更好的方法呢?
答案 0 :(得分:1)
创建通用界面似乎是一种非常干净的方式。 (每条评论,但我虽然值得写)但
module gen
interface test1
module procedure t1,t2
end interface
contains
subroutine t1(y)
real y(:)
write(*,*)'shape is',shape(y)
y=2*y
end subroutine
subroutine t2(y)
real y(:,:)
write(*,*)'shape is',shape(y)
y=2*y
end subroutine
end module
use gen
real m(4),n(3,3)
m=4
n=3
call test1(m)
call test1(n)
end
答案 1 :(得分:0)
使用英特尔,您也可以使用MAP / UNION,因此您可以将1d作为1d传递,并将2D作为其MAP / UNION 1D版本传递。
您可能想要使用RESHAPE,但通常不需要它,具体取决于您正在做什么。
您的评论&#34;显然不能通过矩阵&#34;似乎与我所知道的相反。如果它是2D,并且总是2D,则没有任何问题。你可以通过任何等级。